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

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

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

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

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

引入依赖包

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

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

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

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

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

2)EmptyIfNull

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

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

3)FixedSizeList

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

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

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

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

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

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

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

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

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

6)Index Of

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

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

7)Select

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

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

9)IsEqualList

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

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

如下所示:LyK28资讯网——每日最新资讯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至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 签约井川里予、何丹彤,单视频点赞近千万,MCN黑马永恒文希快速崛起!

    来源:视听观察永恒文希传媒作为一家MCN公司,说起它的名字来,可能大家会觉得有点儿陌生,但是说出来下面一串的名字之后,或许大家就会感到震惊,原来这么多网红,都签约这家公司了。根
  • 当家的盒马,加速谋生

    来源 | 价值星球Planet作者 | 归去来自己&ldquo;当家&rdquo;的盒马,开始加速谋生了。据盒马官微消息,盒马计划今年开放生鲜供应链,将其生鲜商品送往食堂。目前,盒马在上海已经与
  • 小米公益基金会捐赠2500万元驰援北京、河北暴雨救灾

    8月2日消息,今日小米科技创始人雷军在其微博上发布消息称,小米公益基金会宣布捐赠2500万元驰援北京、河北暴雨救灾。携手抗灾,京冀安康!以下为公告原文
  • Android 14发布:首批适配机型公布

    5月11日消息,谷歌在今天凌晨举行了I/O大会,本次发布会谷歌带来了自家的AI语言模型PaLM 2、谷歌Pixel Fold折叠屏、谷歌Pixel 7a手机,同时发布了Androi
  • 中关村论坛11月25日开幕,15位诺奖级大咖将发表演讲

    11月18日,记者从2022中关村论坛新闻发布会上获悉,中关村论坛将于11月25至30日在京举行。本届中关村论坛由科学技术部、国家发展改革委、工业和信息化部、国务
Top