开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:掘金/C站/腾讯云/阿里云/华为云/51CTO(全网同号);欢迎大家常来逛逛,互相学习。
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前言
作为一名 Java 全栈攻城狮,我们日常工作中经常要面对集合的操作。无论是在后端实现复杂的业务逻辑,还是与前端交互传输数据,集合类型(如 List、Set、Map)总是扮演着关键角色。对于许多常见的操作,如集合的判空、合并、差集、交集、并集等,我们可能会在多个地方写相似的代码,导致代码冗长且不易维护。而这时候,我们就需要一个像 Apache Commons Collections 提供的 CollectionUtils
这样的工具类,帮助我们简化这些集合操作,提高开发效率和代码可维护性。
通过使用 CollectionUtils
,我们可以减少编写重复代码的麻烦,让集合操作变得更加简单高效。本篇文章将深入探讨如何使用 CollectionUtils
来简化集合操作,包括判空、差集、交集、并集等常见操作。通过实际案例,我们将展示如何在项目中高效地使用这些工具。
一、JDK 判空 vs CollectionUtils 判空:谁才是王者?
判空是我们编写 Java 代码时最常用的操作之一。每次我们处理一个集合,首先都要判断它是否为空。使用 JDK 自带的判空方法,通常我们会这么写:
java
if (list == null || list.isEmpty()) {
// 处理空集合
}
这段代码本身没有问题,但是每次都需要重复判断集合是否为 null
或者为空,而且代码比较冗长。特别是在项目中,类似的判空逻辑可能会出现在多个地方,增加了代码量和出错的风险。为了避免手动处理这些繁琐的判空逻辑,我们可以使用 CollectionUtils.isEmpty()
来代替手动判空:
java
if (CollectionUtils.isEmpty(list)) {
// 处理空集合
}
看,代码变得更加简洁明了。CollectionUtils.isEmpty()
方法能够同时判断集合是否为 null
或者是否为空,这样你就不再需要手动编写多余的 null
判断代码了。通过这种方式,我们不仅提高了代码的可读性,还减少了出错的机会,避免了在不同地方重复编写相同的判空代码。
此外,CollectionUtils.isEmpty()
还具有以下优点:
- 简洁明了:减少冗余代码。
- 统一性:通过工具类,判空逻辑保持一致,避免了分散在不同地方的判空代码。
- 安全性 :避免了在判空时可能出现的
NullPointerException
。
二、集合的差集、交集、并集:用工具类来简化操作
除了判空操作外,集合的差集、交集和并集也是非常常见的需求。假设你需要处理两个集合,找出它们的差集、交集或者并集,传统的方法通常是手动编写大量的循环和条件判断,代码较为复杂,且容易出错。而 CollectionUtils
提供了非常方便的方法,可以帮助你轻松地实现这些操作。
1. 差集:subtract()
方法
差集操作是找出一个集合中有,而另一个集合中没有的元素。比如,假设我们有两个集合 list1
和 list2
,我们想找出 list1
中有而 list2
中没有的元素,CollectionUtils.subtract()
方法就能轻松帮我们完成:
java
import org.apache.commons.collections4.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
/**
* @Author ms
* @Date 2025年6月22日20:43:49
*/
public class Test1 {
public static void main(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 依赖:
xml
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
📝 小结:
本例清晰地展示了如何快速用 CollectionUtils
工具类对集合数据进行差异分析,代码简洁、实用性强。
2. 交集:intersection()
方法
交集操作是找出两个集合中都存在的元素。如果我们想从两个集合 list1
和 list2
中找到它们的交集,CollectionUtils.intersection()
方法就能帮我们解决这个问题:
java
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()
方法非常适合:
java
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 元的用户。下面是实现代码:
java
class User {
String name;
List<Order> orders;
}
class Order {
int amount;
}
List<User> users = // 一些用户信息集合
接下来,我们通过 CollectionUtils.select()
方法筛选出符合条件的用户:
java
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import java.util.Arrays;
import java.util.List;
import java.util.ArrayList;
/**
* @Author ms
* @Date 2025年6月22日20:43:49
*/
public class Test2 {
public static void main(String[] args) {
// 模拟用户列表
List<User> users = new ArrayList<>();
users.add(new User("Alice", Arrays.asList(new Order(600), new Order(500))));
users.add(new User("Bob", Arrays.asList(new Order(300), new Order(200))));
// 使用 CollectionUtils.select 过滤订单总金额大于1000的用户
List<User> result = (List<User>) CollectionUtils.select(users, new Predicate<User>() {
@Override
public boolean evaluate(User user) {
int totalAmount = user.getOrders().stream().mapToInt(Order::getAmount).sum();
return totalAmount > 1000;
}
});
result.forEach(u -> System.out.println("高价值用户: " + u.getName()));
}
}
通过上述代码,select()
方法会遍历用户集合,并筛选出那些订单总金额超过 1000 元的用户。通过这种方式,我们能够轻松实现对集合的筛选,且代码简洁易懂。
代码解析:
如上这段 Java 案例代码的主要功能是:筛选出订单总金额超过 1000 的用户,并打印他们的名字。下面是详细的解析:
👣 代码执行流程简述:
- 创建用户列表:
java
List<User> users = new ArrayList<>();
创建一个用户集合,并加入两个用户:
- "Alice",她有两笔订单:600 和 500;
- "Bob",他的订单是 300 和 200。
- 使用
CollectionUtils.select()
过滤用户:
java
List<User> result = (List<User>) CollectionUtils.select(users, new Predicate<User>() { ... });
使用 Apache 的 CollectionUtils.select()
方法对 users
进行筛选。Predicate
接口中定义了判断逻辑:
- 通过
user.getOrders().stream().mapToInt(Order::getAmount).sum()
计算该用户所有订单的总金额; - 如果总金额大于 1000,就保留该用户。
- 输出结果:
java
result.forEach(u -> System.out.println("高价值用户: " + u.getName()));
遍历筛选后的用户列表,打印姓名。
✅ 输出结果:
在本例中:
- Alice 的订单总额是 600 + 500 = 1100,大于 1000,符合条件;
- Bob 的订单总额是 500,不符合条件。
所以输出:
json
高价值用户: Alice
🧾 小结:
- 使用 Apache Commons Collections 的工具类做集合筛选;
- 实现了订单金额汇总 + 条件判断;
- 代码简洁,逻辑清晰,适合做数据过滤类任务。
本地运行结果展示:

四、总结
本期,我们通过对 CollectionUtils
工具类的学习,深入探讨了如何高效地进行集合操作。从判空到差集、交集、并集的计算,再到如何通过筛选来处理数据源,CollectionUtils
都提供了非常便捷和高效的工具方法,让我们能够更快、更简洁地处理集合数据。
下次你在处理集合时,不妨使用 CollectionUtils
,简化你的代码,提高开发效率。让我们告别冗长的集合操作代码,享受更为高效、简洁的开发过程!快去体验下吧~~
... ...
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
... ...
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。 ⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!