这年头,还有谁不会用CollectionUtils类?也太...

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:掘金/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() 还具有以下优点:

  1. 简洁明了:减少冗余代码。
  2. 统一性:通过工具类,判空逻辑保持一致,避免了分散在不同地方的判空代码。
  3. 安全性 :避免了在判空时可能出现的 NullPointerException

二、集合的差集、交集、并集:用工具类来简化操作

除了判空操作外,集合的差集、交集和并集也是非常常见的需求。假设你需要处理两个集合,找出它们的差集、交集或者并集,传统的方法通常是手动编写大量的循环和条件判断,代码较为复杂,且容易出错。而 CollectionUtils 提供了非常方便的方法,可以帮助你轻松地实现这些操作。

1. 差集:subtract() 方法

差集操作是找出一个集合中有,而另一个集合中没有的元素。比如,假设我们有两个集合 list1list2,我们想找出 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() 方法,返回了 list1list2 的差集,即 list1 中有而 list2 中没有的元素,结果是 [A, D]

本地测试结果展示如下:

详细代码解析:

如上这段代码演示了如何使用 Apache Commons Collections 中的 CollectionUtils.subtract() 方法来对两个集合做差集运算,以下是大致解析:

🔍 功能概述:

CollectionUtils.subtract(list1, list2) 的作用是:返回一个新的集合,包含所有在 list1 中但不在 list2 中的元素

🔧 程序流程解析:

  1. 定义了两个列表:

    • list1 包含 "A", "B", "C", "D"
    • list2 包含 "B", "C"
  2. 调用 subtract() 方法对两个列表做差集运算。

  3. 打印结果:[A, D]

    • 因为 "A" 和 "D" 只存在于 list1,不在 list2 中。

应用场景:

  • 找出被删除的元素;
  • 比较两个版本的数据差异;
  • 数据去重处理等。

📦 依赖说明:

要使用 CollectionUtils.subtract(),需引入 Maven 依赖:

xml 复制代码
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-collections4</artifactId>
    <version>4.4</version>
</dependency>

📝 小结:

本例清晰地展示了如何快速用 CollectionUtils 工具类对集合数据进行差异分析,代码简洁、实用性强。

2. 交集:intersection() 方法

交集操作是找出两个集合中都存在的元素。如果我们想从两个集合 list1list2 中找到它们的交集,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() 方法,返回了 list1list2 的交集,即 [B, C],这就是两个集合中共同存在的元素。

3. 并集:union() 方法

并集操作的目标是将两个集合合并,并去除重复的元素。假设我们有两个集合 list1list2,如果想要将它们合并成一个集合并去掉重复项,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() 方法,我们可以将 list1list2 合并成一个新的集合 [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 的用户,并打印他们的名字。下面是详细的解析:

👣 代码执行流程简述:

  1. 创建用户列表
java 复制代码
   List<User> users = new ArrayList<>();

创建一个用户集合,并加入两个用户:

  • "Alice",她有两笔订单:600 和 500;
  • "Bob",他的订单是 300 和 200。
  1. 使用 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,就保留该用户。
  1. 输出结果
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 !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。 ⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

相关推荐
jack_yin3 分钟前
🏆多MCP智能体交互,让大模型成为你的电脑管家
后端
前端付豪4 分钟前
美团 ETA 模型在线训练与推理加速实践
前端·后端·架构
春与秋其代序6 分钟前
微前端:前端架构的新趋势
后端
吴尊和11 分钟前
生成长篇小说的朗读语音小说
后端
阿乾之铭12 分钟前
Spring Boot 项目初始化
java·spring boot·后端
wei_shuo12 分钟前
华为云 Flexus+DeepSeek 实战:华为云单机部署 Dify-LLM 开发平台全流程指南【服务部署、模型配置、知识库构建全流程】
android·java·华为云
JWASX15 分钟前
【RocketMQ 生产者和消费者】- 消费者的订阅关系一致性
java·rocketmq·订阅一致性
剁椒豆腐脑1 小时前
阶段二JavaSE进阶阶段之设计模式&继承 2.2
java·设计模式·跳槽·学习方法·改行学it
扫地僧9851 小时前
免费1000套编程教学视频资料视频(涉及Java、python、C C++、R语言、PHP C# HTML GO)
java·c++·音视频
青春:一叶知秋1 小时前
【C++开发】CMake构建工具
java·开发语言·c++