当前位置:首页 > 科技  > 软件

ListUtils技巧大全:提升你的Java列表操作效率

来源: 责编: 时间:2023-11-06 17:18:17 171观看
导读本文将介绍Apache Commons Collection库中的ListUtils类。这个类为Java中的List接口提供了实用功能和装饰方法。引入依赖包<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-collections

本文将介绍Apache Commons Collection库中的ListUtils类。这个类为Java中的List接口提供了实用功能和装饰方法。lTK28资讯网——每日最新资讯28at.com

lTK28资讯网——每日最新资讯28at.com

引入依赖包

<dependency>   <groupId>org.apache.commons</groupId>   <artifactId>commons-collections4</artifactId>   <version>4.4</version> </dependency>

我们现在创建一个简单的用户对象,使用这个对象来测试ListUtils类的功能性。如下所示:lTK28资讯网——每日最新资讯28at.com

@Data@AllArgsConstructor@NoArgsConstructorpublic class UserObject {    private String userName;    private Integer userId;    private Double userSalary;}

接下来创建一个叫做 defaultUserList的列表:lTK28资讯网——每日最新资讯28at.com

List<UserObject> defaultUserList = Arrays.asList(   new UserObject("User1", 1, 10000.0),   new UserObject("User2", 2, 20000.0),   new UserObject("User3", 3, 30000.0),   new UserObject("User4", 4, 40000.0),   new UserObject("User5", 5, 50000.0));

ListUtils核心功能

1)DefaultIfNull

它接收两个参数:一个默认列表和一个用户列表。如果现有的用户列表为空,该方法将返回默认列表。当通过List实例处理引用数据时,这很有用。它可以防止发生空指针异常。lTK28资讯网——每日最新资讯28at.com

List<UserObject> nullList = null;assertEquals(defaultUserList,ListUtils.defaultIfNull(defaultUserList, nullList));

2)EmptyIfNull

它接收一个用户列表作为输入参数,如果用户列表为空,则返回一个空列表,避免发生空指针异常。lTK28资讯网——每日最新资讯28at.com

List<UserObject> nullList = null;assertTrue(ListUtils.emptyIfNull(nullList).isEmpty());

3)FixedSizeList

这个方法是输出一个固定大小的列表,不能添加或删除元素,但可以编辑列表的元素。lTK28资讯网——每日最新资讯28at.com

如下面的代码所示,如果我们尝试从固定列表中添加还是删除元素,都会抛出UnsupportedOperationException。lTK28资讯网——每日最新资讯28at.com

List < UserObject > fixedList = ListUtils.fixedSizeList(defaultUserList); assertEquals(Double.valueOf(10000), fixedList.get(0).getUserSalary()); Exception exception = assertThrows(UnsupportedOperationException.class,         () -> {                 fixedList.add(new UserObject("User6", 6, 60000.0));         }); assertEquals("List is fixed size", exception.getMessage()); assertThrows(UnsupportedOperationException.class, () -> {         fixedList.remove(0); });

4)PredicatedList

当我们希望将谓词作为对用户列表的检查时,这个方法非常有用,可以使用两种方式。lTK28资讯网——每日最新资讯28at.com

方法1:创建一个包含用户数据的列表,然后使用谓词进行验证。如果存在元素未通过谓词条件,则抛出错误。lTK28资讯网——每日最新资讯28at.com

例如:ListUtils.predicatedList检查输入列表的所有元素的salary参数是否大于20000.0;如果不是,它将抛出IllegalArgumentException。lTK28资讯网——每日最新资讯28at.com

assertThrows(IllegalArgumentException.class, () -> {   ListUtils.predicatedList(defaultUserList,     userObj -> userObj.getUserSalary() > 20000.0);  });

方法2:在数据插入列表时执行验证。通过输入一个空列表和一个谓词条件,可以获取一个预测列表。当我们尝试添加一个新的数据条目时,它会与谓词进行验证,如果条件不满足,就会抛出异常。lTK28资讯网——每日最新资讯28at.com

List<UserObject> predicatedUserList = ListUtils.predicatedList(    new ArrayList<UserObject>(),    userObj -> userObj.getUserSalary() > 20000.0);  assertThrows(IllegalArgumentException.class, () -> {   predicatedUserList.add(new UserObject("User", 2, 10000.0));  });

5)Partition

该方法通过指定子列表的大小将用户列表划分为子列表。如下所示:lTK28资讯网——每日最新资讯28at.com

List<List<UserObject>> partitionedList = ListUtils    .partition(defaultUserList, 2);  assertEquals(3, partitionedList.size());

6)Index Of

该方法接受用户列表和谓词作为输入。然后找到第一个满足谓词条件的元素并返回其下标。lTK28资讯网——每日最新资讯28at.com

int indexOfObject = ListUtils.indexOf(defaultUserList,    userObj -> userObj.getUserSalary().equals(20000.0));  assertEquals(1, indexOfObject);

7)Select

它与Java 8流过滤器的工作方式相同,接收用户列表和谓词作为输入,并返回满足谓词条件的参数列表。lTK28资讯网——每日最新资讯28at.com

// Java 8 Stream示例 List<UserObject> java8List = defaultUserList    .stream()    .filter(userObj -> userObj.getUserSalary() > 20000.0)    .collect(Collectors.toList());  assertEquals(3, java8List.size());
// ListUtils.select方法使用示例 List<UserObject> predicatedList = ListUtils.select(defaultUserList,    userObj -> userObj.getUserSalary() > 20000.0);  assertEquals(3, predicatedList.size());

8)SelectRejected

这个方法是ListUtils.select的逆操作。将用户列表和谓词作为输入传递给此方法,并返回所有不满足谓词条件的元素列表。lTK28资讯网——每日最新资讯28at.com

List<UserObject> listNotMeetingPredicate = ListUtils.selectRejected(    defaultUserList, userObj -> userObj.getUserSalary() > 20000.0);  assertEquals(2, listNotMeetingPredicate.size());

9)IsEqualList

此方法用于比较两个列表。仅当两个列表具有相同的大小,并且两个列表中所有相应的元素对都相等时,才返回true。lTK28资讯网——每日最新资讯28at.com

List<Integer> list1 = Arrays.asList(1, 2, 3, 4);  List<Integer> list2 = Arrays.asList(1, 2, 3, 4);  List<Integer> list3 = Arrays.asList(3, 4, 5, 6, 7);    assertTrue(ListUtils.isEqualList(list1, list2));  assertFalse(ListUtils.isEqualList(list1, list3));

它还可以比较两个不同的List接口实现。示例如下:比较ArrayList、LinkedList和HashSet。lTK28资讯网——每日最新资讯28at.com

List<Integer> list1 = Arrays.asList(1, 2, 3, 4);  List<Integer> linkedList = new LinkedList<>(list1);  Set<Integer> hashSet = new HashSet<>(list1);  assertTrue(ListUtils.isEqualList(list1, linkedList));  assertTrue(ListUtils.isEqualList(list1, hashSet));

10)Intersection

该方法接受两个列表作为输入,并返回两个列表的交集。lTK28资讯网——每日最新资讯28at.com

List<Integer> list1 = Arrays.asList(1, 2, 3, 4);  List<Integer> list3 = Arrays.asList(3, 4, 5, 6, 7);   assertEquals(Arrays.asList(3, 4), ListUtils.intersection(list1, list3));

11)LazyList

这是ListUtils类提供的另一个有趣的方法。它接收一个列表和一个转换器或工厂作为输入,然后返回一个懒加载列表,其元素在需要时创建。lTK28资讯网——每日最新资讯28at.com

如下所示:lTK28资讯网——每日最新资讯28at.com

Transformer<Integer, UserObject> transformer = input -> {   if (defaultUserList.size() > input)    return defaultUserList.get(input);   else    return new UserObject();  };  List<UserObject> lazyList = ListUtils    .lazyList(new ArrayList<UserObject>(),    transformer);  assertEquals(defaultUserList.get(0), lazyList.get(0));  assertEquals(new UserObject(), lazyList.get(6));  assertEquals(1, lazyList.indexOf(null));

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-17244-0.htmlListUtils技巧大全:提升你的Java列表操作效率

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Go 语言开发的基于指标的监控系统 Prometheus

下一篇: 超越基础:Flutter 中 onTap 事件的五条规则让你脱颖而出

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 红魔电竞平板评测:大屏幕硬实力

    红魔电竞平板评测:大屏幕硬实力

    前言:三年的疫情因为要上网课的原因激活了平板市场,如今网课的时代已经过去,大家的生活都恢复到了正轨,这也就意味着,真正考验平板电脑生存的环境来了。也就是面对着这种残酷的
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 东方甄选单飞:有些鸟注定是关不住的

    东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    携众多高端产品亮相ChinaJoy,小米带来一场科技与人文的视听盛宴

    7月28日,全球数字娱乐领域最具知名度与影响力的年度盛会中国国际数码互动娱乐展览会(简称ChinaJoy)在上海新国际博览中心盛大开幕。作为全球领先的科
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top
Baidu
map