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

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

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

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

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

引入依赖包

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

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

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

接下来创建一个叫做 defaultUserList的列表:2jw28资讯网——每日最新资讯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实例处理引用数据时,这很有用。它可以防止发生空指针异常。2jw28资讯网——每日最新资讯28at.com

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

2)EmptyIfNull

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

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

3)FixedSizeList

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

如下面的代码所示,如果我们尝试从固定列表中添加还是删除元素,都会抛出UnsupportedOperationException。2jw28资讯网——每日最新资讯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

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

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

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

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

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

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

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

6)Index Of

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

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

7)Select

它与Java 8流过滤器的工作方式相同,接收用户列表和谓词作为输入,并返回满足谓词条件的参数列表。2jw28资讯网——每日最新资讯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的逆操作。将用户列表和谓词作为输入传递给此方法,并返回所有不满足谓词条件的元素列表。2jw28资讯网——每日最新资讯28at.com

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

9)IsEqualList

此方法用于比较两个列表。仅当两个列表具有相同的大小,并且两个列表中所有相应的元素对都相等时,才返回true。2jw28资讯网——每日最新资讯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。2jw28资讯网——每日最新资讯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

该方法接受两个列表作为输入,并返回两个列表的交集。2jw28资讯网——每日最新资讯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类提供的另一个有趣的方法。它接收一个列表和一个转换器或工厂作为输入,然后返回一个懒加载列表,其元素在需要时创建。2jw28资讯网——每日最新资讯28at.com

如下所示:2jw28资讯网——每日最新资讯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));

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

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

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

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

标签:
  • 热门焦点
  • K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 8月总票房已突破10亿!《封神》第一:口碑已经成了

    8月5日消息,据灯塔专业版数据,截至8月5日9时35分,8月总票房(含预售)已突破10亿。其中,《封神》以大比分的优势领先。根据官方消息,目前该片总票房已经超过14.
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 从 Pulsar Client 的原理到它的监控面板

    背景前段时间业务团队偶尔会碰到一些 Pulsar 使用的问题,比如消息阻塞不消费了、生产者消息发送缓慢等各种问题。虽然我们有个监控页面可以根据 topic 维度查看他的发送状态,
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 最“俊美”淘宝卖家,靠直播和短视频圈粉,上架秒光,年销3000万

    来源 | 电商在线文|易琬玉编辑|斯问受访店铺:Ringdoll戒之人形图源:微博@御座的黄山、&ldquo;Ringdoll戒之人形&rdquo;淘宝店铺有关外貌的评价,黄山已经听累了。生于1985年的他,哪
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的&ldquo;网红&rdquo;。7月5日至9日,为期5天的东方甄选&ldquo;甘肃行&rdquo;首次在自有App内直播,
Top