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

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

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

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

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

引入依赖包

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

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

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

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

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

2)EmptyIfNull

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

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

3)FixedSizeList

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

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

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

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

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

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

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

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

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

6)Index Of

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

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

7)Select

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

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

9)IsEqualList

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

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

如下所示:LMH28资讯网——每日最新资讯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官方停产 第三方瞬间涨价

    K60 Pro官方停产 第三方瞬间涨价

    虽然没有官方宣布,但Redmi的一些高管也已经透露了,Redmi K60 Pro已经停产且不会补货,这一切都是为了即将到来的K60 Ultra铺路,属于厂家的正常操作。但有意思的是该机在停产之后
  • 卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    卢伟冰长文解析K60至尊版 对Redmi有着里程碑式的意义

    在今天的Redmi后性能时代战略发布会结束之后,Redmi总经理卢伟冰又带来了一篇长文,详解了为什么 Redmi 要开启后性能时代?为什么选择和 MediaTek、Pixelworks 深度合作?以及后性
  • Mate60手机壳曝光 致敬自己的经典设计

    Mate60手机壳曝光 致敬自己的经典设计

    8月3日消息,今天下午博主数码闲聊站带来了华为Mate60的第三方手机壳图,可以让我们在真机发布之前看看这款华为全新旗舰的大致轮廓。从曝光的图片看,Mate 60背后摄像头面积依然
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 2023年,我眼中的字节跳动

    2023年,我眼中的字节跳动

    此时此刻(2023年7月),字节跳动从未上市,也从未公布过任何官方的上市计划;但是这并不妨碍它成为中国最受关注的互联网公司之一。从2016-17年的抖音强势崛起,到2018年的&ldquo;头腾
  • 慕岩炮轰抖音,百合网今何在?

    慕岩炮轰抖音,百合网今何在?

    来源:价值研究所 作者:Hernanderz&ldquo;难道就因为自己的一个产品牛逼了,从客服到总裁,都不愿意正视自己产品和运营上的问题,选择逃避了吗?&rdquo;这一番话,出自百合网联合创
  • 共享单车的故事讲到哪了?

    共享单车的故事讲到哪了?

    来源丨海克财经与共享充电宝相差不多,共享单车已很久没有被国内热点新闻关照到了。除了一再涨价和用户直呼用不起了。近日多家媒体再发报道称,成都、天津、郑州等地多个共享单
  • 造车两年股价跌六成,小米的估值逻辑变了吗?

    造车两年股价跌六成,小米的估值逻辑变了吗?

    如果从小米官宣造车后的首个交易日起持有小米集团的股票,那么截至2023年上半年最后一个交易日,投资者将浮亏59.16%,同区间的恒生科技指数跌幅为52.78%
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
Top