全文目录:
- 开篇语
- 前言
- 一、JDK 判空 vs CollectionUtils 判空:谁才是王者?
- 二、集合的差集、交集、并集:用工具类来简化操作
- 1. 差集:`subtract()` 方法
- 2. 交集:`intersection()` 方法
- 3. 并集:`union()` 方法
- 三、实战示例:结合筛选与组合数据源
- 需求:找出订单金额超过 1000 元的用户
- 四、总结
- 文末
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
作为一名 Java 全栈攻城狮,我们日常工作中经常要面对集合的操作。无论是在后端实现复杂的业务逻辑,还是与前端交互传输数据,集合类型(如 List、Set、Map)总是扮演着关键角色。对于许多常见的操作,如集合的判空、合并、差集、交集、并集等,我们可能会在多个地方写相似的代码,导致代码冗长且不易维护。而这时候,我们就需要一个像 Apache Commons Collections 提供的CollectionUtils这样的工具类,帮助我们简化这些集合操作,提高开发效率和代码可维护性。
通过使用CollectionUtils,我们可以减少编写重复代码的麻烦,让集合操作变得更加简单高效。本篇文章将深入探讨如何使用CollectionUtils来简化集合操作,包括判空、差集、交集、并集等常见操作。通过实际案例,我们将展示如何在项目中高效地使用这些工具。
一、JDK 判空 vs CollectionUtils 判空:谁才是王者?
判空是我们编写 Java 代码时最常用的操作之一。每次我们处理一个集合,首先都要判断它是否为空。使用 JDK 自带的判空方法,通常我们会这么写:
if(list==null||list.isEmpty()){// 处理空集合}这段代码本身没有问题,但是每次都需要重复判断集合是否为null或者为空,而且代码比较冗长。特别是在项目中,类似的判空逻辑可能会出现在多个地方,增加了代码量和出错的风险。为了避免手动处理这些繁琐的判空逻辑,我们可以使用CollectionUtils.isEmpty()来代替手动判空:
if(CollectionUtils.isEmpty(list)){// 处理空集合}看,代码变得更加简洁明了。CollectionUtils.isEmpty()方法能够同时判断集合是否为null或者是否为空,这样你就不再需要手动编写多余的null判断代码了。通过这种方式,我们不仅提高了代码的可读性,还减少了出错的机会,避免了在不同地方重复编写相同的判空代码。
此外,CollectionUtils.isEmpty()还具有以下优点:
- 简洁明了:减少冗余代码。
- 统一性:通过工具类,判空逻辑保持一致,避免了分散在不同地方的判空代码。
- 安全性:避免了在判空时可能出现的
NullPointerException。
二、集合的差集、交集、并集:用工具类来简化操作
除了判空操作外,集合的差集、交集和并集也是非常常见的需求。假设你需要处理两个集合,找出它们的差集、交集或者并集,传统的方法通常是手动编写大量的循环和条件判断,代码较为复杂,且容易出错。而CollectionUtils提供了非常方便的方法,可以帮助你轻松地实现这些操作。
1. 差集:subtract()方法
差集操作是找出一个集合中有,而另一个集合中没有的元素。比如,假设我们有两个集合list1和list2,我们想找出list1中有而list2中没有的元素,CollectionUtils.subtract()方法就能轻松帮我们完成:
importorg.apache.commons.collections4.CollectionUtils;importjava.util.Arrays;importjava.util.Collection;importjava.util.List;/** * @Author ms * @Date 2025年6月22日20:43:49 */publicclassTest1{publicstaticvoidmain(String[]args){List<String>list1=Arrays.asList("A","B","C","D");List<String>list2=Arrays.asList("B","C");Collection<String>diff=CollectionUtils.subtract(list1,list2);System.out.println(diff);// 输出 [A, D]}}这段代码调用了CollectionUtils.subtract()方法,返回了list1和list2的差集,即list1中有而list2中没有的元素,结果是[A, D]。
本地测试结果展示如下:
详细代码解析:
如上这段代码演示了如何使用 Apache Commons Collections 中的CollectionUtils.subtract()方法来对两个集合做差集运算,以下是大致解析:
🔍功能概述:
CollectionUtils.subtract(list1, list2)的作用是:返回一个新的集合,包含所有在 list1 中但不在 list2 中的元素。
🔧程序流程解析:
定义了两个列表:
list1包含 “A”, “B”, “C”, “D”list2包含 “B”, “C”
调用
subtract()方法对两个列表做差集运算。打印结果:
[A, D]- 因为 “A” 和 “D” 只存在于
list1,不在list2中。
- 因为 “A” 和 “D” 只存在于
✅应用场景:
- 找出被删除的元素;
- 比较两个版本的数据差异;
- 数据去重处理等。
📦依赖说明:
要使用CollectionUtils.subtract(),需引入 Maven 依赖:
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.4</version></dependency>📝小结:
本例清晰地展示了如何快速用CollectionUtils工具类对集合数据进行差异分析,代码简洁、实用性强。
2. 交集:intersection()方法
交集操作是找出两个集合中都存在的元素。如果我们想从两个集合list1和list2中找到它们的交集,CollectionUtils.intersection()方法就能帮我们解决这个问题:
List<String>list1=Arrays.asList("A","B","C","D");List<String>list2=Arrays.asList("B","C","E");Collection<String>intersection=CollectionUtils.intersection(list1,list2);System.out.println(intersection);// 输出 [B, C]通过intersection()方法,返回了list1和list2的交集,即[B, C],这就是两个集合中共同存在的元素。
3. 并集:union()方法
并集操作的目标是将两个集合合并,并去除重复的元素。假设我们有两个集合list1和list2,如果想要将它们合并成一个集合并去掉重复项,CollectionUtils.union()方法非常适合:
List<String>list1=Arrays.asList("A","B","C");List<String>list2=Arrays.asList("C","D","E");Collection<String>union=CollectionUtils.union(list1,list2);System.out.println(union);// 输出 [A, B, C, D, E]通过union()方法,我们可以将list1和list2合并成一个新的集合[A, B, C, D, E],并且自动去除了重复的元素(C)。
三、实战示例:结合筛选与组合数据源
在实际开发中,我们可能需要从多个数据源中筛选出符合条件的数据,并将它们组合成一个新的集合。例如,在电商系统中,我们可能需要从用户订单数据中筛选出那些订单金额超过 1000 元的用户,并返回符合条件的用户列表。如何高效地完成这一操作呢?
通过CollectionUtils.select(),我们可以非常轻松地筛选出符合条件的元素。
需求:找出订单金额超过 1000 元的用户
假设我们有一个用户集合,每个用户有多个订单。我们需要找出所有订单金额总和超过 1000 元的用户。下面是实现代码:
classUser{Stringname;List<Order>orders;}classOrder{intamount;}List<User>users=// 一些用户信息集合接下来,我们通过CollectionUtils.select()方法筛选出符合条件的用户:
importorg.apache.commons.collections4.CollectionUtils;importorg.apache.commons.collections4.Predicate;importjava.util.Arrays;importjava.util.List;importjava.util.ArrayList;/** * @Author ms * @Date 2025年6月22日20:43:49 */publicclassTest2{publicstaticvoidmain(String[]args){// 模拟用户列表List<User>users=newArrayList<>();users.add(newUser("Alice",Arrays.asList(newOrder(600),newOrder(500))));users.add(newUser("Bob",Arrays.asList(newOrder(300),newOrder(200))));// 使用 CollectionUtils.select 过滤订单总金额大于1000的用户List<User>result=(List<User>)CollectionUtils.select(users,newPredicate<User>(){@Overridepublicbooleanevaluate(Useruser){inttotalAmount=user.getOrders().stream().mapToInt(Order::getAmount).sum();returntotalAmount>1000;}});result.forEach(u->System.out.println("高价值用户: "+u.getName()));}}通过上述代码,select()方法会遍历用户集合,并筛选出那些订单总金额超过 1000 元的用户。通过这种方式,我们能够轻松实现对集合的筛选,且代码简洁易懂。
代码解析:
如上这段 Java 案例代码的主要功能是:筛选出订单总金额超过 1000 的用户,并打印他们的名字。下面是详细的解析:
👣代码执行流程简述:
- 创建用户列表:
List<User>users=newArrayList<>();创建一个用户集合,并加入两个用户:
- “Alice”,她有两笔订单:600 和 500;
- “Bob”,他的订单是 300 和 200。
- 使用
CollectionUtils.select()过滤用户:
List<User>result=(List<User>)CollectionUtils.select(users,newPredicate<User>(){...});使用 Apache 的CollectionUtils.select()方法对users进行筛选。Predicate接口中定义了判断逻辑:
- 通过
user.getOrders().stream().mapToInt(Order::getAmount).sum()计算该用户所有订单的总金额; - 如果总金额大于 1000,就保留该用户。
- 输出结果:
result.forEach(u->System.out.println("高价值用户: "+u.getName()));遍历筛选后的用户列表,打印姓名。
✅输出结果:
在本例中:
- Alice的订单总额是 600 + 500 =1100,大于 1000,符合条件;
- Bob的订单总额是 500,不符合条件。
所以输出:
高价值用户:Alice🧾小结:
- 使用 Apache Commons Collections 的工具类做集合筛选;
- 实现了订单金额汇总 + 条件判断;
- 代码简洁,逻辑清晰,适合做数据过滤类任务。
本地运行结果展示:
四、总结
本期,我们通过对CollectionUtils工具类的学习,深入探讨了如何高效地进行集合操作。从判空到差集、交集、并集的计算,再到如何通过筛选来处理数据源,CollectionUtils都提供了非常便捷和高效的工具方法,让我们能够更快、更简洁地处理集合数据。
下次你在处理集合时,不妨使用CollectionUtils,简化你的代码,提高开发效率。让我们告别冗长的集合操作代码,享受更为高效、简洁的开发过程!快去体验下吧~~
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!