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

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

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

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

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

引入依赖包

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

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

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

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

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

2)EmptyIfNull

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

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

3)FixedSizeList

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

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

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

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

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

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

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

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

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

6)Index Of

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

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

7)Select

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

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

9)IsEqualList

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

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

如下所示:etH28资讯网——每日最新资讯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 事件的五条规则让你脱颖而出

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

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 6月安卓手机好评榜:魅族20 Pro蝉联冠军

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年6月1日至6月30日,仅限国内市场。第一名:魅族20 Pro好评率:95%5月份的时候魅族20 Pro就是
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 三星电子Q2营收60万亿韩元 存储业务营收同比仍下滑超过50%

    7月27日消息,据外媒报道,从三星电子所发布的财报来看,他们主要利润来源的存储芯片业务在今年二季度仍不乐观,营收同比仍在大幅下滑,所在的设备解决方案
Top