[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-apache-commons-collectionutils-gongjuleixiangjiefangfajieshaoyushizhanyingyong":3},{"id":4,"title":5,"slug":6,"summary":7,"content":8,"contentHtml":9,"wordCount":10,"readingTime":11,"categoryId":12,"tags":13,"coverImage":13,"thumbnail":13,"status":14,"isTop":15,"isRecommended":15,"allowComments":15,"password":13,"viewCount":16,"likeCount":15,"commentCount":15,"seoTitle":5,"seoKeywords":17,"seoDescription":18,"source":13,"sourceUrl":13,"publishTime":19},"2002993510968520705","Apache Commons CollectionUtils 工具类详解：方法介绍与实战应用","apache-commons-collectionutils-gongjuleixiangjiefangfajieshaoyushizhanyingyong","## 1. 概述 `org.apache.commons.collections4.CollectionUtils` 是 Apache Commons Collections 库中的一个**核心工具类**，专门用于简化 Java 集合（List、Set、Map 等）的常见操作。它提供了丰富的静态方法，涵盖了集合的**空值判断**、**集合运算**、**过滤转换**、**比较统计**等多种场景，能够显著减少冗余代码，提高开发效率和代码可读性。 在传统的 Java 开发中，我们经常需要编写重复的代码来处理集合，例如手动判断集合是否为空、使用循环实现集合的交集和并集操作等。这些代码不仅冗长，而且容易出错。CollectionUtils 工具类的出现，使得我们能够通过**一行代码**完成复杂的集合操作，让开发人员更专注于业务逻辑而非底层实现。 **工具类优势总结：** -...","## 1. 概述\n\n`org.apache.commons.collections4.CollectionUtils` 是 Apache Commons Collections 库中的一个**核心工具类**，专门用于简化 Java 集合（List、Set、Map 等）的常见操作。它提供了丰富的静态方法，涵盖了集合的**空值判断**、**集合运算**、**过滤转换**、**比较统计**等多种场景，能够显著减少冗余代码，提高开发效率和代码可读性。\n\n在传统的 Java 开发中，我们经常需要编写重复的代码来处理集合，例如手动判断集合是否为空、使用循环实现集合的交集和并集操作等。这些代码不仅冗长，而且容易出错。CollectionUtils 工具类的出现，使得我们能够通过**一行代码**完成复杂的集合操作，让开发人员更专注于业务逻辑而非底层实现。\n\n**工具类优势总结：**\n- **代码简洁性**：减少模板代码，使集合操作更直观。\n- **安全性**：内置空指针安全处理，避免常见的 `NullPointerException`。\n- **功能丰富**：提供集合运算、过滤、转换等一站式解决方案。\n- **高性能**：经过优化测试，保证操作效率。\n\n## 2. 环境准备\n\n在使用 CollectionUtils 工具类之前，我们需要在项目中引入 Apache Commons Collections4 库。\n\n### Maven 依赖配置\n\n```xml\n\u003Cdependency>\n    \u003CgroupId>org.apache.commons\u003C\u002FgroupId>\n    \u003CartifactId>commons-collections4\u003C\u002FartifactId>\n    \u003Cversion>4.4\u003C\u002Fversion>\n\u003C\u002Fdependency>\n```\n\n### Gradle 依赖配置\n\n```gradle\nimplementation 'org.apache.commons:commons-collections4:4.4'\n```\n\n**注意**：Commons Collections 有两个主要版本：`commons-collections`（旧版本 3.x，不支持泛型）和 `commons-collections4`（版本 4.x，支持泛型并需要 Java 8 以上）。推荐直接使用 `commons-collections4` 以获得更好的类型安全和功能支持。\n\n## 3. 常用方法详解与实例\n\n下面我们将 CollectionUtils 的常用方法分为几大类，分别介绍其功能并提供实际代码示例。\n\n### 3.1 集合判空操作\n\n空值判断是集合操作中最基础也是最常见的需求。CollectionUtils 提供了安全的方法来处理可能为空的集合。\n\n| 方法名 | 功能描述 | 返回值 |\n|-------|---------|--------|\n| `isEmpty(Collection\u003C?> coll)` | 判断集合为 null 或空 | boolean |\n| `isNotEmpty(Collection\u003C?> coll)` | 判断集合非 null 且非空 | boolean |\n| `emptyIfNull(Collection\u003CT> coll)` | 集合为 null 时返回空集合 | Collection\u003CT> |\n\n**传统判空方式 vs CollectionUtils：**\n\n```java\n\u002F\u002F 传统方式：需要手动检查 null 和 empty\nif (list == null || list.isEmpty()) {\n    \u002F\u002F 处理空集合逻辑\n}\n\n\u002F\u002F 使用 CollectionUtils：一行代码搞定\nif (CollectionUtils.isEmpty(list)) {\n    \u002F\u002F 处理空集合逻辑\n}\n```\n\n**完整示例代码：**\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class EmptyCheckExample {\n    public static void main(String[] args) {\n        \u002F\u002F 测试各种集合状态\n        List\u003CString> nullList = null;\n        List\u003CString> emptyList = new ArrayList\u003C>();\n        List\u003CString> normalList = Arrays.asList(\"A\", \"B\", \"C\");\n        \n        \u002F\u002F isEmpty 方法测试\n        System.out.println(\"nullList isEmpty: \" + CollectionUtils.isEmpty(nullList)); \u002F\u002F true\n        System.out.println(\"emptyList isEmpty: \" + CollectionUtils.isEmpty(emptyList)); \u002F\u002F true\n        System.out.println(\"normalList isEmpty: \" + CollectionUtils.isEmpty(normalList)); \u002F\u002F false\n        \n        \u002F\u002F isNotEmpty 方法测试\n        System.out.println(\"nullList isNotEmpty: \" + CollectionUtils.isNotEmpty(nullList)); \u002F\u002F false\n        System.out.println(\"normalList isNotEmpty: \" + CollectionUtils.isNotEmpty(normalList)); \u002F\u002F true\n        \n        \u002F\u002F emptyIfNull 方法测试\n        List\u003CString> safeList1 = CollectionUtils.emptyIfNull(nullList);\n        List\u003CString> safeList2 = CollectionUtils.emptyIfNull(normalList);\n        System.out.println(\"safeList1 size: \" + safeList1.size()); \u002F\u002F 0\n        System.out.println(\"safeList2: \" + safeList2); \u002F\u002F [A, B, C]\n    }\n}\n```\n\n**运行结果：**\n```\nnullList isEmpty: true\nemptyList isEmpty: true\nnormalList isEmpty: false\nnullList isNotEmpty: false\nnormalList isNotEmpty: true\nsafeList1 size: 0\nsafeList2: [A, B, C]\n```\n\n### 3.2 集合运算操作\n\nCollectionUtils 提供了一系列数学集合运算方法，可以轻松实现交集、并集、差集等常见操作。\n\n#### 3.2.1 并集（Union）\n\n并集操作返回两个集合中所有不重复的元素。\n\n```java\npublic class UnionExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\");\n        List\u003CString> list2 = Arrays.asList(\"B\", \"C\", \"D\");\n        \n        Collection\u003CString> union = CollectionUtils.union(list1, list2);\n        System.out.println(\"并集结果: \" + union); \u002F\u002F [A, B, C, D]\n    }\n}\n```\n\n#### 3.2.2 交集（Intersection）\n\n交集操作返回两个集合中共有的元素。\n\n```java\npublic class IntersectionExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\");\n        List\u003CString> list2 = Arrays.asList(\"B\", \"C\", \"D\");\n        \n        Collection\u003CString> intersection = CollectionUtils.intersection(list1, list2);\n        System.out.println(\"交集结果: \" + intersection); \u002F\u002F [B, C]\n    }\n}\n```\n\n#### 3.2.3 差集（Subtract）\n\n差集操作返回第一个集合中有而第二个集合中没有的元素。\n\n```java\npublic class SubtractExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\");\n        List\u003CString> list2 = Arrays.asList(\"B\", \"C\", \"D\");\n        \n        Collection\u003CString> subtract = CollectionUtils.subtract(list1, list2);\n        System.out.println(\"差集结果: \" + subtract); \u002F\u002F [A]\n    }\n}\n```\n\n#### 3.2.4 对称差集（Disjunction）\n\n对称差集返回两个集合中互不相同的元素，即去掉交集后的所有元素。\n\n```java\npublic class DisjunctionExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\");\n        List\u003CString> list2 = Arrays.asList(\"B\", \"C\", \"D\");\n        \n        Collection\u003CString> disjunction = CollectionUtils.disjunction(list1, list2);\n        System.out.println(\"对称差集结果: \" + disjunction); \u002F\u002F [A, D]\n    }\n}\n```\n\n### 3.3 集合过滤与转换\n\nCollectionUtils 提供了强大的过滤和转换功能，可以轻松处理集合中的元素。\n\n#### 3.3.1 过滤（Filter）\n\n`filter` 方法会**直接修改原集合**，只保留满足条件的元素。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport org.apache.commons.collections4.Predicate;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class FilterExample {\n    public static void main(String[] args) {\n        List\u003CInteger> numbers = new ArrayList\u003C>(Arrays.asList(1, 2, 3, 4, 5, 6));\n        \n        \u002F\u002F 过滤偶数：使用 Predicate 接口\n        CollectionUtils.filter(numbers, new Predicate\u003CInteger>() {\n            @Override\n            public boolean evaluate(Integer number) {\n                return number % 2 == 0;\n            }\n        });\n        \n        System.out.println(\"过滤后的集合: \" + numbers); \u002F\u002F [2, 4, 6]\n        \n        \u002F\u002F Java 8+ 可以使用 Lambda 表达式简化\n        List\u003CInteger> anotherList = new ArrayList\u003C>(Arrays.asList(1, 2, 3, 4, 5));\n        CollectionUtils.filter(anotherList, n -> n % 2 == 0);\n        System.out.println(\"Lambda 过滤结果: \" + anotherList); \u002F\u002F [2, 4]\n    }\n}\n```\n\n#### 3.3.2 转换（Collect）\n\n`collect` 方法将集合中的元素转换为另一种类型，**返回新集合**而不修改原集合。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport org.apache.commons.collections4.Transformer;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class CollectExample {\n    public static void main(String[] args) {\n        List\u003CString> stringList = Arrays.asList(\"1\", \"2\", \"3\", \"4\", \"5\");\n        \n        \u002F\u002F 将字符串转换为整数\n        List\u003CInteger> integerList = (List\u003CInteger>) CollectionUtils.collect(stringList, new Transformer\u003CString, Integer>() {\n            @Override\n            public Integer transform(String input) {\n                return Integer.parseInt(input);\n            }\n        });\n        \n        System.out.println(\"转换后的集合: \" + integerList); \u002F\u002F [1, 2, 3, 4, 5]\n        \n        \u002F\u002F 使用 Lambda 表达式简化\n        List\u003CInteger> lambdaResult = (List\u003CInteger>) CollectionUtils.collect(stringList, s -> Integer.parseInt(s));\n        System.out.println(\"Lambda 转换结果: \" + lambdaResult); \u002F\u002F [1, 2, 3, 4, 5]\n    }\n}\n```\n\n#### 3.3.3 属性提取实例\n\n在实际开发中，我们经常需要从对象集合中提取某个属性的集合。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport org.apache.commons.collections4.Transformer;\nimport java.util.ArrayList;\nimport java.util.HashMap;\nimport java.util.List;\nimport java.util.Map;\n\npublic class PropertyExtractionExample {\n    public static void main(String[] args) {\n        \u002F\u002F 创建包含人员信息的Map列表\n        List\u003CMap\u003CString, Object>> personList = new ArrayList\u003C>();\n        \n        Map\u003CString, Object> person1 = new HashMap\u003C>();\n        person1.put(\"name\", \"张三\");\n        person1.put(\"age\", 25);\n        person1.put(\"department\", \"技术部\");\n        \n        Map\u003CString, Object> person2 = new HashMap\u003C>();\n        person2.put(\"name\", \"李四\");\n        person2.put(\"age\", 30);\n        person2.put(\"department\", \"市场部\");\n        \n        Map\u003CString, Object> person3 = new HashMap\u003C>();\n        person3.put(\"name\", \"王五\");\n        person3.put(\"age\", 28);\n        person3.put(\"department\", \"技术部\");\n        \n        personList.add(person1);\n        personList.add(person2);\n        personList.add(person3);\n        \n        \u002F\u002F 提取所有人员姓名\n        List\u003CString> nameList = (List\u003CString>) CollectionUtils.collect(personList, new Transformer\u003CMap\u003CString, Object>, String>() {\n            @Override\n            public String transform(Map\u003CString, Object> person) {\n                return (String) person.get(\"name\");\n            }\n        });\n        \n        System.out.println(\"人员姓名列表: \" + nameList); \u002F\u002F [张三, 李四, 王五]\n        \n        \u002F\u002F 提取特定部门的人员\n        List\u003CMap\u003CString, Object>> techPersons = new ArrayList\u003C>(personList);\n        CollectionUtils.filter(techPersons, new Predicate\u003CMap\u003CString, Object>>() {\n            @Override\n            public boolean evaluate(Map\u003CString, Object> person) {\n                return \"技术部\".equals(person.get(\"department\"));\n            }\n        });\n        \n        System.out.println(\"技术部人员数量: \" + techPersons.size()); \u002F\u002F 2\n    }\n}\n```\n\n### 3.4 集合比较与统计\n\nCollectionUtils 提供了多种比较和统计方法，方便我们对集合数据进行验证和分析。\n\n#### 3.4.1 包含判断\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class ContainsExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\", \"D\", \"E\");\n        List\u003CString> list2 = Arrays.asList(\"B\", \"D\");\n        List\u003CString> list3 = Arrays.asList(\"X\", \"Y\");\n        \n        \u002F\u002F 判断 list1 是否包含 list2 的所有元素\n        boolean containsAll = CollectionUtils.containsAll(list1, list2);\n        System.out.println(\"list1 包含 list2 所有元素: \" + containsAll); \u002F\u002F true\n        \n        \u002F\u002F 判断两个集合是否有任何共同元素\n        boolean containsAny = CollectionUtils.containsAny(list1, list2);\n        System.out.println(\"list1 和 list2 有共同元素: \" + containsAny); \u002F\u002F true\n        \n        boolean containsAny2 = CollectionUtils.containsAny(list1, list3);\n        System.out.println(\"list1 和 list3 有共同元素: \" + containsAny2); \u002F\u002F false\n    }\n}\n```\n\n#### 3.4.2 集合相等判断\n\n`isEqualCollection` 方法判断两个集合是否包含相同的元素（忽略顺序）。\n\n```java\npublic class EqualCollectionExample {\n    public static void main(String[] args) {\n        List\u003CString> list1 = Arrays.asList(\"A\", \"B\", \"C\", \"C\"); \u002F\u002F 有两个 C\n        List\u003CString> list2 = Arrays.asList(\"C\", \"B\", \"A\", \"C\"); \u002F\u002F 顺序不同，但元素相同\n        List\u003CString> list3 = Arrays.asList(\"A\", \"B\", \"C\");     \u002F\u002F 只有一个 C\n        \n        boolean isEqual1 = CollectionUtils.isEqualCollection(list1, list2);\n        boolean isEqual2 = CollectionUtils.isEqualCollection(list1, list3);\n        \n        System.out.println(\"list1 和 list2 是否相等: \" + isEqual1); \u002F\u002F true\n        System.out.println(\"list1 和 list3 是否相等: \" + isEqual2); \u002F\u002F false\n    }\n}\n```\n\n#### 3.4.3 元素统计\n\n`frequency` 方法统计指定元素在集合中出现的次数。\n\n```java\npublic class FrequencyExample {\n    public static void main(String[] args) {\n        List\u003CString> fruits = Arrays.asList(\"apple\", \"banana\", \"apple\", \"orange\", \"apple\", \"banana\");\n        \n        int appleCount = CollectionUtils.frequency(fruits, \"apple\");\n        int bananaCount = CollectionUtils.frequency(fruits, \"banana\");\n        int orangeCount = CollectionUtils.frequency(fruits, \"orange\");\n        int grapeCount = CollectionUtils.frequency(fruits, \"grape\");\n        \n        System.out.println(\"苹果出现次数: \" + appleCount); \u002F\u002F 3\n        System.out.println(\"香蕉出现次数: \" + bananaCount); \u002F\u002F 2\n        System.out.println(\"橙子出现次数: \" + orangeCount); \u002F\u002F 1\n        System.out.println(\"葡萄出现次数: \" + grapeCount); \u002F\u002F 0\n    }\n}\n```\n\n### 3.5 其他实用方法\n\n#### 3.5.1 安全添加元素\n\n`addIgnoreNull` 方法在添加元素时会忽略 null 值，避免集合中出现不必要的空值。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class AddIgnoreNullExample {\n    public static void main(String[] args) {\n        List\u003CString> list = new ArrayList\u003C>();\n        \n        \u002F\u002F 安全添加元素\n        CollectionUtils.addIgnoreNull(list, \"Hello\");\n        CollectionUtils.addIgnoreNull(list, null); \u002F\u002F 这个不会被添加\n        CollectionUtils.addIgnoreNull(list, \"World\");\n        \n        System.out.println(\"列表内容: \" + list); \u002F\u002F [Hello, World]\n    }\n}\n```\n\n#### 3.5.2 合并有序集合\n\n`collate` 方法用于合并两个已排序的集合，并保持排序顺序。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport java.util.Arrays;\nimport java.util.List;\n\npublic class CollateExample {\n    public static void main(String[] args) {\n        List\u003CString> sortedList1 = Arrays.asList(\"A\", \"C\", \"E\");\n        List\u003CString> sortedList2 = Arrays.asList(\"B\", \"D\", \"F\");\n        \n        List\u003CString> mergedList = CollectionUtils.collate(sortedList1, sortedList2);\n        System.out.println(\"合并后的有序列表: \" + mergedList); \u002F\u002F [A, B, C, D, E, F]\n    }\n}\n```\n\n## 4. 实战应用案例\n\n### 4.1 案例一：用户订单过滤系统\n\n假设我们有一个电商系统，需要从用户订单中筛选出符合特定条件的高价值订单。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport org.apache.commons.collections4.Predicate;\nimport java.util.ArrayList;\nimport java.util.Arrays;\nimport java.util.List;\n\n\u002F\u002F 订单类\nclass Order {\n    private String orderId;\n    private String userId;\n    private double amount;\n    private String status;\n    \n    public Order(String orderId, String userId, double amount, String status) {\n        this.orderId = orderId;\n        this.userId = userId;\n        this.amount = amount;\n        this.status = status;\n    }\n    \n    \u002F\u002F getter 方法省略...\n}\n\n\u002F\u002F 用户订单过滤系统\npublic class OrderFilterSystem {\n    public static void main(String[] args) {\n        \u002F\u002F 模拟订单数据\n        List\u003COrder> orders = Arrays.asList(\n            new Order(\"001\", \"user1\", 1500.0, \"completed\"),\n            new Order(\"002\", \"user2\", 800.0, \"completed\"),\n            new Order(\"003\", \"user3\", 2500.0, \"pending\"),\n            new Order(\"004\", \"user1\", 1200.0, \"completed\"),\n            new Order(\"005\", \"user4\", 3000.0, \"completed\")\n        );\n        \n        \u002F\u002F 筛选已完成的高价值订单（金额大于1000）\n        List\u003COrder> highValueOrders = new ArrayList\u003C>(orders);\n        CollectionUtils.filter(highValueOrders, new Predicate\u003COrder>() {\n            @Override\n            public boolean evaluate(Order order) {\n                return \"completed\".equals(order.getStatus()) && order.getAmount() > 1000;\n            }\n        });\n        \n        System.out.println(\"高价值订单数量: \" + highValueOrders.size());\n        \n        \u002F\u002F 提取订单金额\n        List\u003CDouble> amounts = (List\u003CDouble>) CollectionUtils.collect(highValueOrders, new Transformer\u003COrder, Double>() {\n            @Override\n            public Double transform(Order order) {\n                return order.getAmount();\n            }\n        });\n        \n        System.out.println(\"高价值订单金额: \" + amounts);\n        \n        \u002F\u002F 计算总金额\n        double totalAmount = 0;\n        for (Double amount : amounts) {\n            totalAmount += amount;\n        }\n        \n        System.out.println(\"高价值订单总金额: \" + totalAmount);\n    }\n}\n```\n\n### 4.2 案例二：数据分析与报表生成\n\n在企业级应用中，我们经常需要对数据进行各种分析处理。\n\n```java\nimport org.apache.commons.collections4.CollectionUtils;\nimport java.util.*;\n\npublic class DataAnalysisExample {\n    public static void main(String[] args) {\n        \u002F\u002F 模拟销售数据\n        List\u003CMap\u003CString, Object>> salesData = Arrays.asList(\n            createRecord(\"2024-01\", \"北京\", \"产品A\", 100),\n            createRecord(\"2024-01\", \"上海\", \"产品A\", 150),\n            createRecord(\"2024-01\", \"北京\", \"产品B\", 200),\n            createRecord(\"2024-02\", \"北京\", \"产品A\", 120),\n            createRecord(\"2024-02\", \"上海\", \"产品B\", 180)\n        );\n        \n        \u002F\u002F 1. 找出所有不同的产品\n        Set\u003CString> allProducts = new HashSet\u003C>();\n        CollectionUtils.collect(salesData, record -> (String) record.get(\"product\"), allProducts);\n        System.out.println(\"所有产品: \" + allProducts);\n        \n        \u002F\u002F 2. 筛选北京地区的销售记录\n        List\u003CMap\u003CString, Object>> beijingSales = new ArrayList\u003C>(salesData);\n        CollectionUtils.filter(beijingSales, record -> \"北京\".equals(record.get(\"region\")));\n        System.out.println(\"北京地区销售记录数量: \" + beijingSales.size());\n        \n        \u002F\u002F 3. 按月份分组统计\n        Map\u003CString, Integer> monthlySales = new HashMap\u003C>();\n        for (Map\u003CString, Object> record : salesData) {\n            String month = (String) record.get(\"month\");\n            Integer amount = (Integer) record.get(\"amount\");\n            monthlySales.put(month, monthlySales.getOrDefault(month, 0) + amount);\n        }\n        \n        System.out.println(\"月度销售统计: \" + monthlySales);\n        \n        \u002F\u002F 4. 找出销量最好的产品\n        Map\u003CString, Integer> productSales = new HashMap\u003C>();\n        for (Map\u003CString, Object> record : salesData) {\n            String product = (String) record.get(\"product\");\n            Integer amount = (Integer) record.get(\"amount\");\n            productSales.put(product, productSales.getOrDefault(product, 0) + amount);\n        }\n        \n        String bestProduct = Collections.max(productSales.entrySet(), Map.Entry.comparingByValue()).getKey();\n        System.out.println(\"销量最好的产品: \" + bestProduct + \", 销量: \" + productSales.get(bestProduct));\n    }\n    \n    private static Map\u003CString, Object> createRecord(String month, String region, String product, int amount) {\n        Map\u003CString, Object> record = new HashMap\u003C>();\n        record.put(\"month\", month);\n        record.put(\"region\", region);\n        record.put(\"product\", product);\n        record.put(\"amount\", amount);\n        return record;\n    }\n}\n```\n\n## 5. 总结与最佳实践\n\nApache Commons CollectionUtils 是一个功能强大且实用的工具类，它可以显著简化集合操作代码，提高开发效率。通过本文的介绍，我们可以看到它在各种场景下的强大应用能力。\n\n### 5.1 主要优势总结\n\n1. **代码简洁性**：将复杂的集合操作简化为单行方法调用，减少样板代码。\n2. **空安全**：内置对 null 值的处理，避免空指针异常。\n3. **功能全面**：提供集合运算、过滤、转换、统计等一站式解决方案。\n4. **性能优化**：经过充分测试和优化，保证执行效率。\n\n### 5.2 最佳实践建议\n\n1. **版本选择**：优先选择 `commons-collections4` 而不是旧版的 `commons-collections`，以获得更好的泛型支持和性能。\n\n2. **与 Java Stream API 的配合使用**：在 Java 8+ 环境中，可以结合使用 CollectionUtils 和 Stream API，根据具体场景选择更合适的工具。\n   ```java\n   \u002F\u002F CollectionUtils 方式\n   CollectionUtils.filter(list, predicate);\n   \n   \u002F\u002F Stream API 方式\n   list.stream().filter(predicate).collect(Collectors.toList());\n   ```\n\n3. **性能注意事项**：\n   - 对于大型集合，注意集合运算方法（如 `union`, `intersection`）会创建新集合，可能带来内存开销。\n   - 在频繁操作的场景下，考虑使用原生循环或 Stream API 进行性能优化。\n\n4. **集合选择策略**：\n   - 需要有序且不重复：`SetUniqueList`\n   - 需要计数功能：`Bag` 实现类\n   - 需要双向映射：`BidiMap`\n\n### 5.3 学习建议\n\n对于初学者来说，建议从最常用的方法开始掌握：\n1. 先熟练掌握空值判断方法（`isEmpty`, `isNotEmpty`）\n2. 然后学习集合运算方法（`union`, `intersection`, `subtract`）\n3. 最后掌握过滤转换等高级功能（`filter`, `collect`）\n\n随着实践的深入，可以进一步探索 Collections 框架中的其他工具类，如 `ListUtils`, `SetUtils`, `MapUtils` 等，它们为特定类型的集合提供了更专业的操作方法。\n\nCollectionUtils 工具类是 Java 开发者工具箱中不可或缺的利器，合理使用它将使你的代码更加简洁、健壮和可维护。","\u003Ch2 data-line=\"0\" id=\"1. 概述\">1. 概述\u003C\u002Fh2>\n\u003Cp data-line=\"2\">\u003Ccode>org.apache.commons.collections4.CollectionUtils\u003C\u002Fcode> 是 Apache Commons Collections 库中的一个\u003Cstrong>核心工具类\u003C\u002Fstrong>，专门用于简化 Java 集合（List、Set、Map 等）的常见操作。它提供了丰富的静态方法，涵盖了集合的\u003Cstrong>空值判断\u003C\u002Fstrong>、\u003Cstrong>集合运算\u003C\u002Fstrong>、\u003Cstrong>过滤转换\u003C\u002Fstrong>、\u003Cstrong>比较统计\u003C\u002Fstrong>等多种场景，能够显著减少冗余代码，提高开发效率和代码可读性。\u003C\u002Fp>\n\u003Cp data-line=\"4\">在传统的 Java 开发中，我们经常需要编写重复的代码来处理集合，例如手动判断集合是否为空、使用循环实现集合的交集和并集操作等。这些代码不仅冗长，而且容易出错。CollectionUtils 工具类的出现，使得我们能够通过\u003Cstrong>一行代码\u003C\u002Fstrong>完成复杂的集合操作，让开发人员更专注于业务逻辑而非底层实现。\u003C\u002Fp>\n\u003Cp data-line=\"6\">\u003Cstrong>工具类优势总结：\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cul data-line=\"7\">\n\u003Cli data-line=\"7\">\u003Cstrong>代码简洁性\u003C\u002Fstrong>：减少模板代码，使集合操作更直观。\u003C\u002Fli>\n\u003Cli data-line=\"8\">\u003Cstrong>安全性\u003C\u002Fstrong>：内置空指针安全处理，避免常见的 \u003Ccode>NullPointerException\u003C\u002Fcode>。\u003C\u002Fli>\n\u003Cli data-line=\"9\">\u003Cstrong>功能丰富\u003C\u002Fstrong>：提供集合运算、过滤、转换等一站式解决方案。\u003C\u002Fli>\n\u003Cli data-line=\"10\">\u003Cstrong>高性能\u003C\u002Fstrong>：经过优化测试，保证操作效率。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 data-line=\"12\" id=\"2. 环境准备\">2. 环境准备\u003C\u002Fh2>\n\u003Cp data-line=\"14\">在使用 CollectionUtils 工具类之前，我们需要在项目中引入 Apache Commons Collections4 库。\u003C\u002Fp>\n\u003Ch3 data-line=\"16\" id=\"Maven 依赖配置\">Maven 依赖配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"18\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">xml\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-xml\" language=xml>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>org.apache.commons\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">groupId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>commons-collections4\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">artifactId\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n    \u003Cspan class=\"hljs-tag\">&lt;\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>4.4\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">version\u003C\u002Fspan>&gt;\u003C\u002Fspan>\n\u003Cspan class=\"hljs-tag\">&lt;\u002F\u003Cspan class=\"hljs-name\">dependency\u003C\u002Fspan>&gt;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"26\" id=\"Gradle 依赖配置\">Gradle 依赖配置\u003C\u002Fh3>\n\n        \u003Cdetails  data-line=\"28\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">gradle\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-gradle\" language=gradle>\u003Cspan class=\"md-editor-code-block\">implementation \u003Cspan class=\"hljs-string\">&#x27;org.apache.commons:commons-collections4:4.4&#x27;\u003C\u002Fspan>\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"32\">\u003Cstrong>注意\u003C\u002Fstrong>：Commons Collections 有两个主要版本：\u003Ccode>commons-collections\u003C\u002Fcode>（旧版本 3.x，不支持泛型）和 \u003Ccode>commons-collections4\u003C\u002Fcode>（版本 4.x，支持泛型并需要 Java 8 以上）。推荐直接使用 \u003Ccode>commons-collections4\u003C\u002Fcode> 以获得更好的类型安全和功能支持。\u003C\u002Fp>\n\u003Ch2 data-line=\"34\" id=\"3. 常用方法详解与实例\">3. 常用方法详解与实例\u003C\u002Fh2>\n\u003Cp data-line=\"36\">下面我们将 CollectionUtils 的常用方法分为几大类，分别介绍其功能并提供实际代码示例。\u003C\u002Fp>\n\u003Ch3 data-line=\"38\" id=\"3.1 集合判空操作\">3.1 集合判空操作\u003C\u002Fh3>\n\u003Cp data-line=\"40\">空值判断是集合操作中最基础也是最常见的需求。CollectionUtils 提供了安全的方法来处理可能为空的集合。\u003C\u002Fp>\n\u003Ctable data-line=\"42\">\n\u003Cthead data-line=\"42\">\n\u003Ctr data-line=\"42\">\n\u003Cth>方法名\u003C\u002Fth>\n\u003Cth>功能描述\u003C\u002Fth>\n\u003Cth>返回值\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody data-line=\"44\">\n\u003Ctr data-line=\"44\">\n\u003Ctd>\u003Ccode>isEmpty(Collection&lt;?&gt; coll)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>判断集合为 null 或空\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"45\">\n\u003Ctd>\u003Ccode>isNotEmpty(Collection&lt;?&gt; coll)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>判断集合非 null 且非空\u003C\u002Ftd>\n\u003Ctd>boolean\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr data-line=\"46\">\n\u003Ctd>\u003Ccode>emptyIfNull(Collection&lt;T&gt; coll)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>集合为 null 时返回空集合\u003C\u002Ftd>\n\u003Ctd>Collection\u003CT>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp data-line=\"48\">\u003Cstrong>传统判空方式 vs CollectionUtils：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"50\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F 传统方式：需要手动检查 null 和 empty\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (list == \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan> || list.isEmpty()) {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 处理空集合逻辑\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 使用 CollectionUtils：一行代码搞定\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">if\u003C\u002Fspan> (CollectionUtils.isEmpty(list)) {\n    \u003Cspan class=\"hljs-comment\">\u002F\u002F 处理空集合逻辑\u003C\u002Fspan>\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"62\">\u003Cstrong>完整示例代码：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"64\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.ArrayList;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">EmptyCheckExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 测试各种集合状态\u003C\u002Fspan>\n        List&lt;String&gt; nullList = \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>;\n        List&lt;String&gt; emptyList = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;();\n        List&lt;String&gt; normalList = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F isEmpty 方法测试\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;nullList isEmpty: &quot;\u003C\u002Fspan> + CollectionUtils.isEmpty(nullList)); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;emptyList isEmpty: &quot;\u003C\u002Fspan> + CollectionUtils.isEmpty(emptyList)); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;normalList isEmpty: &quot;\u003C\u002Fspan> + CollectionUtils.isEmpty(normalList)); \u003Cspan class=\"hljs-comment\">\u002F\u002F false\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F isNotEmpty 方法测试\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;nullList isNotEmpty: &quot;\u003C\u002Fspan> + CollectionUtils.isNotEmpty(nullList)); \u003Cspan class=\"hljs-comment\">\u002F\u002F false\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;normalList isNotEmpty: &quot;\u003C\u002Fspan> + CollectionUtils.isNotEmpty(normalList)); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F emptyIfNull 方法测试\u003C\u002Fspan>\n        List&lt;String&gt; safeList1 = CollectionUtils.emptyIfNull(nullList);\n        List&lt;String&gt; safeList2 = CollectionUtils.emptyIfNull(normalList);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;safeList1 size: &quot;\u003C\u002Fspan> + safeList1.size()); \u003Cspan class=\"hljs-comment\">\u002F\u002F 0\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;safeList2: &quot;\u003C\u002Fspan> + safeList2); \u003Cspan class=\"hljs-comment\">\u002F\u002F [A, B, C]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Cp data-line=\"95\">\u003Cstrong>运行结果：\u003C\u002Fstrong>\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"96\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-\" language=>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-attr\">nullList isEmpty:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">true\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">emptyList isEmpty:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">true\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">normalList isEmpty:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">false\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">nullList isNotEmpty:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">false\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">normalList isNotEmpty:\u003C\u002Fspan> \u003Cspan class=\"hljs-literal\">true\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">safeList1 size:\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>\n\u003Cspan class=\"hljs-attr\">safeList2:\u003C\u002Fspan> [\u003Cspan class=\"hljs-string\">A\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">B\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">C\u003C\u002Fspan>]\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"106\" id=\"3.2 集合运算操作\">3.2 集合运算操作\u003C\u002Fh3>\n\u003Cp data-line=\"108\">CollectionUtils 提供了一系列数学集合运算方法，可以轻松实现交集、并集、差集等常见操作。\u003C\u002Fp>\n\u003Ch4 data-line=\"110\" id=\"3.2.1 并集（Union）\">3.2.1 并集（Union）\u003C\u002Fh4>\n\u003Cp data-line=\"112\">并集操作返回两个集合中所有不重复的元素。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"114\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">UnionExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>);\n        \n        Collection&lt;String&gt; union = CollectionUtils.union(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;并集结果: &quot;\u003C\u002Fspan> + union); \u003Cspan class=\"hljs-comment\">\u002F\u002F [A, B, C, D]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"126\" id=\"3.2.2 交集（Intersection）\">3.2.2 交集（Intersection）\u003C\u002Fh4>\n\u003Cp data-line=\"128\">交集操作返回两个集合中共有的元素。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"130\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">IntersectionExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>);\n        \n        Collection&lt;String&gt; intersection = CollectionUtils.intersection(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;交集结果: &quot;\u003C\u002Fspan> + intersection); \u003Cspan class=\"hljs-comment\">\u002F\u002F [B, C]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"142\" id=\"3.2.3 差集（Subtract）\">3.2.3 差集（Subtract）\u003C\u002Fh4>\n\u003Cp data-line=\"144\">差集操作返回第一个集合中有而第二个集合中没有的元素。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"146\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">SubtractExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>);\n        \n        Collection&lt;String&gt; subtract = CollectionUtils.subtract(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;差集结果: &quot;\u003C\u002Fspan> + subtract); \u003Cspan class=\"hljs-comment\">\u002F\u002F [A]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"158\" id=\"3.2.4 对称差集（Disjunction）\">3.2.4 对称差集（Disjunction）\u003C\u002Fh4>\n\u003Cp data-line=\"160\">对称差集返回两个集合中互不相同的元素，即去掉交集后的所有元素。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"162\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DisjunctionExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>);\n        \n        Collection&lt;String&gt; disjunction = CollectionUtils.disjunction(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;对称差集结果: &quot;\u003C\u002Fspan> + disjunction); \u003Cspan class=\"hljs-comment\">\u002F\u002F [A, D]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"174\" id=\"3.3 集合过滤与转换\">3.3 集合过滤与转换\u003C\u002Fh3>\n\u003Cp data-line=\"176\">CollectionUtils 提供了强大的过滤和转换功能，可以轻松处理集合中的元素。\u003C\u002Fp>\n\u003Ch4 data-line=\"178\" id=\"3.3.1 过滤（Filter）\">3.3.1 过滤（Filter）\u003C\u002Fh4>\n\u003Cp data-line=\"180\">\u003Ccode>filter\u003C\u002Fcode> 方法会\u003Cstrong>直接修改原集合\u003C\u002Fstrong>，只保留满足条件的元素。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"182\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.Predicate;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">FilterExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;Integer&gt; numbers = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;(Arrays.asList(\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">6\u003C\u002Fspan>));\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 过滤偶数：使用 Predicate 接口\u003C\u002Fspan>\n        CollectionUtils.filter(numbers, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Predicate\u003C\u002Fspan>&lt;Integer&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">evaluate\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Integer number)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> number % \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;过滤后的集合: &quot;\u003C\u002Fspan> + numbers); \u003Cspan class=\"hljs-comment\">\u002F\u002F [2, 4, 6]\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F Java 8+ 可以使用 Lambda 表达式简化\u003C\u002Fspan>\n        List&lt;Integer&gt; anotherList = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;(Arrays.asList(\u003Cspan class=\"hljs-number\">1\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">4\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">5\u003C\u002Fspan>));\n        CollectionUtils.filter(anotherList, n -&gt; n % \u003Cspan class=\"hljs-number\">2\u003C\u002Fspan> == \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;Lambda 过滤结果: &quot;\u003C\u002Fspan> + anotherList); \u003Cspan class=\"hljs-comment\">\u002F\u002F [2, 4]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"210\" id=\"3.3.2 转换（Collect）\">3.3.2 转换（Collect）\u003C\u002Fh4>\n\u003Cp data-line=\"212\">\u003Ccode>collect\u003C\u002Fcode> 方法将集合中的元素转换为另一种类型，\u003Cstrong>返回新集合\u003C\u002Fstrong>而不修改原集合。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"214\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.Transformer;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">CollectExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; stringList = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;1&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;2&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;3&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;4&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;5&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 将字符串转换为整数\u003C\u002Fspan>\n        List&lt;Integer&gt; integerList = (List&lt;Integer&gt;) CollectionUtils.collect(stringList, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Transformer\u003C\u002Fspan>&lt;String, Integer&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> Integer \u003Cspan class=\"hljs-title function_\">transform\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String input)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> Integer.parseInt(input);\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;转换后的集合: &quot;\u003C\u002Fspan> + integerList); \u003Cspan class=\"hljs-comment\">\u002F\u002F [1, 2, 3, 4, 5]\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 使用 Lambda 表达式简化\u003C\u002Fspan>\n        List&lt;Integer&gt; lambdaResult = (List&lt;Integer&gt;) CollectionUtils.collect(stringList, s -&gt; Integer.parseInt(s));\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;Lambda 转换结果: &quot;\u003C\u002Fspan> + lambdaResult); \u003Cspan class=\"hljs-comment\">\u002F\u002F [1, 2, 3, 4, 5]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"241\" id=\"3.3.3 属性提取实例\">3.3.3 属性提取实例\u003C\u002Fh4>\n\u003Cp data-line=\"243\">在实际开发中，我们经常需要从对象集合中提取某个属性的集合。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"245\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.Transformer;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.ArrayList;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.HashMap;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Map;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">PropertyExtractionExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 创建包含人员信息的Map列表\u003C\u002Fspan>\n        List&lt;Map&lt;String, Object&gt;&gt; personList = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;();\n        \n        Map&lt;String, Object&gt; person1 = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        person1.put(\u003Cspan class=\"hljs-string\">&quot;name&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;张三&quot;\u003C\u002Fspan>);\n        person1.put(\u003Cspan class=\"hljs-string\">&quot;age&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">25\u003C\u002Fspan>);\n        person1.put(\u003Cspan class=\"hljs-string\">&quot;department&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;技术部&quot;\u003C\u002Fspan>);\n        \n        Map&lt;String, Object&gt; person2 = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        person2.put(\u003Cspan class=\"hljs-string\">&quot;name&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;李四&quot;\u003C\u002Fspan>);\n        person2.put(\u003Cspan class=\"hljs-string\">&quot;age&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">30\u003C\u002Fspan>);\n        person2.put(\u003Cspan class=\"hljs-string\">&quot;department&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;市场部&quot;\u003C\u002Fspan>);\n        \n        Map&lt;String, Object&gt; person3 = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        person3.put(\u003Cspan class=\"hljs-string\">&quot;name&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;王五&quot;\u003C\u002Fspan>);\n        person3.put(\u003Cspan class=\"hljs-string\">&quot;age&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">28\u003C\u002Fspan>);\n        person3.put(\u003Cspan class=\"hljs-string\">&quot;department&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;技术部&quot;\u003C\u002Fspan>);\n        \n        personList.add(person1);\n        personList.add(person2);\n        personList.add(person3);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 提取所有人员姓名\u003C\u002Fspan>\n        List&lt;String&gt; nameList = (List&lt;String&gt;) CollectionUtils.collect(personList, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Transformer\u003C\u002Fspan>&lt;Map&lt;String, Object&gt;, String&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> String \u003Cspan class=\"hljs-title function_\">transform\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Map&lt;String, Object&gt; person)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> (String) person.get(\u003Cspan class=\"hljs-string\">&quot;name&quot;\u003C\u002Fspan>);\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;人员姓名列表: &quot;\u003C\u002Fspan> + nameList); \u003Cspan class=\"hljs-comment\">\u002F\u002F [张三, 李四, 王五]\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 提取特定部门的人员\u003C\u002Fspan>\n        List&lt;Map&lt;String, Object&gt;&gt; techPersons = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;(personList);\n        CollectionUtils.filter(techPersons, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Predicate\u003C\u002Fspan>&lt;Map&lt;String, Object&gt;&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">evaluate\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Map&lt;String, Object&gt; person)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;技术部&quot;\u003C\u002Fspan>.equals(person.get(\u003Cspan class=\"hljs-string\">&quot;department&quot;\u003C\u002Fspan>));\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;技术部人员数量: &quot;\u003C\u002Fspan> + techPersons.size()); \u003Cspan class=\"hljs-comment\">\u002F\u002F 2\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"301\" id=\"3.4 集合比较与统计\">3.4 集合比较与统计\u003C\u002Fh3>\n\u003Cp data-line=\"303\">CollectionUtils 提供了多种比较和统计方法，方便我们对集合数据进行验证和分析。\u003C\u002Fp>\n\u003Ch4 data-line=\"305\" id=\"3.4.1 包含判断\">3.4.1 包含判断\u003C\u002Fh4>\n\n        \u003Cdetails  data-line=\"307\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ContainsExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;E&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; list3 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;X&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;Y&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 判断 list1 是否包含 list2 的所有元素\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">containsAll\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.containsAll(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;list1 包含 list2 所有元素: &quot;\u003C\u002Fspan> + containsAll); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 判断两个集合是否有任何共同元素\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">containsAny\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.containsAny(list1, list2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;list1 和 list2 有共同元素: &quot;\u003C\u002Fspan> + containsAny); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">containsAny2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.containsAny(list1, list3);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;list1 和 list3 有共同元素: &quot;\u003C\u002Fspan> + containsAny2); \u003Cspan class=\"hljs-comment\">\u002F\u002F false\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"332\" id=\"3.4.2 集合相等判断\">3.4.2 集合相等判断\u003C\u002Fh4>\n\u003Cp data-line=\"334\">\u003Ccode>isEqualCollection\u003C\u002Fcode> 方法判断两个集合是否包含相同的元素（忽略顺序）。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"336\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">EqualCollectionExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>); \u003Cspan class=\"hljs-comment\">\u002F\u002F 有两个 C\u003C\u002Fspan>\n        List&lt;String&gt; list2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>); \u003Cspan class=\"hljs-comment\">\u002F\u002F 顺序不同，但元素相同\u003C\u002Fspan>\n        List&lt;String&gt; list3 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>);     \u003Cspan class=\"hljs-comment\">\u002F\u002F 只有一个 C\u003C\u002Fspan>\n        \n        \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">isEqual1\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.isEqualCollection(list1, list2);\n        \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">isEqual2\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.isEqualCollection(list1, list3);\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;list1 和 list2 是否相等: &quot;\u003C\u002Fspan> + isEqual1); \u003Cspan class=\"hljs-comment\">\u002F\u002F true\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;list1 和 list3 是否相等: &quot;\u003C\u002Fspan> + isEqual2); \u003Cspan class=\"hljs-comment\">\u002F\u002F false\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"352\" id=\"3.4.3 元素统计\">3.4.3 元素统计\u003C\u002Fh4>\n\u003Cp data-line=\"354\">\u003Ccode>frequency\u003C\u002Fcode> 方法统计指定元素在集合中出现的次数。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"356\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">FrequencyExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; fruits = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;apple&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;banana&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;apple&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;orange&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;apple&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;banana&quot;\u003C\u002Fspan>);\n        \n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">appleCount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.frequency(fruits, \u003Cspan class=\"hljs-string\">&quot;apple&quot;\u003C\u002Fspan>);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">bananaCount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.frequency(fruits, \u003Cspan class=\"hljs-string\">&quot;banana&quot;\u003C\u002Fspan>);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">orangeCount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.frequency(fruits, \u003Cspan class=\"hljs-string\">&quot;orange&quot;\u003C\u002Fspan>);\n        \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">grapeCount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> CollectionUtils.frequency(fruits, \u003Cspan class=\"hljs-string\">&quot;grape&quot;\u003C\u002Fspan>);\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;苹果出现次数: &quot;\u003C\u002Fspan> + appleCount); \u003Cspan class=\"hljs-comment\">\u002F\u002F 3\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;香蕉出现次数: &quot;\u003C\u002Fspan> + bananaCount); \u003Cspan class=\"hljs-comment\">\u002F\u002F 2\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;橙子出现次数: &quot;\u003C\u002Fspan> + orangeCount); \u003Cspan class=\"hljs-comment\">\u002F\u002F 1\u003C\u002Fspan>\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;葡萄出现次数: &quot;\u003C\u002Fspan> + grapeCount); \u003Cspan class=\"hljs-comment\">\u002F\u002F 0\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"374\" id=\"3.5 其他实用方法\">3.5 其他实用方法\u003C\u002Fh3>\n\u003Ch4 data-line=\"376\" id=\"3.5.1 安全添加元素\">3.5.1 安全添加元素\u003C\u002Fh4>\n\u003Cp data-line=\"378\">\u003Ccode>addIgnoreNull\u003C\u002Fcode> 方法在添加元素时会忽略 null 值，避免集合中出现不必要的空值。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"380\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.ArrayList;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">AddIgnoreNullExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; list = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;();\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 安全添加元素\u003C\u002Fspan>\n        CollectionUtils.addIgnoreNull(list, \u003Cspan class=\"hljs-string\">&quot;Hello&quot;\u003C\u002Fspan>);\n        CollectionUtils.addIgnoreNull(list, \u003Cspan class=\"hljs-literal\">null\u003C\u002Fspan>); \u003Cspan class=\"hljs-comment\">\u002F\u002F 这个不会被添加\u003C\u002Fspan>\n        CollectionUtils.addIgnoreNull(list, \u003Cspan class=\"hljs-string\">&quot;World&quot;\u003C\u002Fspan>);\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;列表内容: &quot;\u003C\u002Fspan> + list); \u003Cspan class=\"hljs-comment\">\u002F\u002F [Hello, World]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch4 data-line=\"399\" id=\"3.5.2 合并有序集合\">3.5.2 合并有序集合\u003C\u002Fh4>\n\u003Cp data-line=\"401\">\u003Ccode>collate\u003C\u002Fcode> 方法用于合并两个已排序的集合，并保持排序顺序。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"403\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">CollateExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        List&lt;String&gt; sortedList1 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;C&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;E&quot;\u003C\u002Fspan>);\n        List&lt;String&gt; sortedList2 = Arrays.asList(\u003Cspan class=\"hljs-string\">&quot;B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;D&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;F&quot;\u003C\u002Fspan>);\n        \n        List&lt;String&gt; mergedList = CollectionUtils.collate(sortedList1, sortedList2);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;合并后的有序列表: &quot;\u003C\u002Fspan> + mergedList); \u003Cspan class=\"hljs-comment\">\u002F\u002F [A, B, C, D, E, F]\u003C\u002Fspan>\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"419\" id=\"4. 实战应用案例\">4. 实战应用案例\u003C\u002Fh2>\n\u003Ch3 data-line=\"421\" id=\"4.1 案例一：用户订单过滤系统\">4.1 案例一：用户订单过滤系统\u003C\u002Fh3>\n\u003Cp data-line=\"423\">假设我们有一个电商系统，需要从用户订单中筛选出符合特定条件的高价值订单。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"425\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.Predicate;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.ArrayList;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.Arrays;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.List;\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 订单类\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String orderId;\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String userId;\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">double\u003C\u002Fspan> amount;\n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> String status;\n    \n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">Order\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String orderId, String userId, \u003Cspan class=\"hljs-type\">double\u003C\u002Fspan> amount, String status)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.orderId = orderId;\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.userId = userId;\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.amount = amount;\n        \u003Cspan class=\"hljs-built_in\">this\u003C\u002Fspan>.status = status;\n    }\n    \n    \u003Cspan class=\"hljs-comment\">\u002F\u002F getter 方法省略...\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F 用户订单过滤系统\u003C\u002Fspan>\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">OrderFilterSystem\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 模拟订单数据\u003C\u002Fspan>\n        List&lt;Order&gt; orders = Arrays.asList(\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;001&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;user1&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">1500.0\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;completed&quot;\u003C\u002Fspan>),\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;002&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;user2&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">800.0\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;completed&quot;\u003C\u002Fspan>),\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;003&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;user3&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">2500.0\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;pending&quot;\u003C\u002Fspan>),\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;004&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;user1&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">1200.0\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;completed&quot;\u003C\u002Fspan>),\n            \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Order\u003C\u002Fspan>(\u003Cspan class=\"hljs-string\">&quot;005&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;user4&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">3000.0\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;completed&quot;\u003C\u002Fspan>)\n        );\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 筛选已完成的高价值订单（金额大于1000）\u003C\u002Fspan>\n        List&lt;Order&gt; highValueOrders = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;(orders);\n        CollectionUtils.filter(highValueOrders, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Predicate\u003C\u002Fspan>&lt;Order&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-type\">boolean\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">evaluate\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Order order)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> \u003Cspan class=\"hljs-string\">&quot;completed&quot;\u003C\u002Fspan>.equals(order.getStatus()) &amp;&amp; order.getAmount() &gt; \u003Cspan class=\"hljs-number\">1000\u003C\u002Fspan>;\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;高价值订单数量: &quot;\u003C\u002Fspan> + highValueOrders.size());\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 提取订单金额\u003C\u002Fspan>\n        List&lt;Double&gt; amounts = (List&lt;Double&gt;) CollectionUtils.collect(highValueOrders, \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">Transformer\u003C\u002Fspan>&lt;Order, Double&gt;() {\n            \u003Cspan class=\"hljs-meta\">@Override\u003C\u002Fspan>\n            \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> Double \u003Cspan class=\"hljs-title function_\">transform\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(Order order)\u003C\u002Fspan> {\n                \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> order.getAmount();\n            }\n        });\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;高价值订单金额: &quot;\u003C\u002Fspan> + amounts);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 计算总金额\u003C\u002Fspan>\n        \u003Cspan class=\"hljs-type\">double\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">totalAmount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>;\n        \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Double amount : amounts) {\n            totalAmount += amount;\n        }\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;高价值订单总金额: &quot;\u003C\u002Fspan> + totalAmount);\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch3 data-line=\"493\" id=\"4.2 案例二：数据分析与报表生成\">4.2 案例二：数据分析与报表生成\u003C\u002Fh3>\n\u003Cp data-line=\"495\">在企业级应用中，我们经常需要对数据进行各种分析处理。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"497\" class=\"md-editor-code\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> org.apache.commons.collections4.CollectionUtils;\n\u003Cspan class=\"hljs-keyword\">import\u003C\u002Fspan> java.util.*;\n\n\u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">class\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">DataAnalysisExample\u003C\u002Fspan> {\n    \u003Cspan class=\"hljs-keyword\">public\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">void\u003C\u002Fspan> \u003Cspan class=\"hljs-title function_\">main\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String[] args)\u003C\u002Fspan> {\n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 模拟销售数据\u003C\u002Fspan>\n        List&lt;Map&lt;String, Object&gt;&gt; salesData = Arrays.asList(\n            createRecord(\u003Cspan class=\"hljs-string\">&quot;2024-01&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;北京&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;产品A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">100\u003C\u002Fspan>),\n            createRecord(\u003Cspan class=\"hljs-string\">&quot;2024-01&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;上海&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;产品A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">150\u003C\u002Fspan>),\n            createRecord(\u003Cspan class=\"hljs-string\">&quot;2024-01&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;北京&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;产品B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">200\u003C\u002Fspan>),\n            createRecord(\u003Cspan class=\"hljs-string\">&quot;2024-02&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;北京&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;产品A&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">120\u003C\u002Fspan>),\n            createRecord(\u003Cspan class=\"hljs-string\">&quot;2024-02&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;上海&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-string\">&quot;产品B&quot;\u003C\u002Fspan>, \u003Cspan class=\"hljs-number\">180\u003C\u002Fspan>)\n        );\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 1. 找出所有不同的产品\u003C\u002Fspan>\n        Set&lt;String&gt; allProducts = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashSet\u003C\u002Fspan>&lt;&gt;();\n        CollectionUtils.collect(salesData, record -&gt; (String) record.get(\u003Cspan class=\"hljs-string\">&quot;product&quot;\u003C\u002Fspan>), allProducts);\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;所有产品: &quot;\u003C\u002Fspan> + allProducts);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 2. 筛选北京地区的销售记录\u003C\u002Fspan>\n        List&lt;Map&lt;String, Object&gt;&gt; beijingSales = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">ArrayList\u003C\u002Fspan>&lt;&gt;(salesData);\n        CollectionUtils.filter(beijingSales, record -&gt; \u003Cspan class=\"hljs-string\">&quot;北京&quot;\u003C\u002Fspan>.equals(record.get(\u003Cspan class=\"hljs-string\">&quot;region&quot;\u003C\u002Fspan>)));\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;北京地区销售记录数量: &quot;\u003C\u002Fspan> + beijingSales.size());\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 3. 按月份分组统计\u003C\u002Fspan>\n        Map&lt;String, Integer&gt; monthlySales = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Map&lt;String, Object&gt; record : salesData) {\n            \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">month\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> (String) record.get(\u003Cspan class=\"hljs-string\">&quot;month&quot;\u003C\u002Fspan>);\n            \u003Cspan class=\"hljs-type\">Integer\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">amount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> (Integer) record.get(\u003Cspan class=\"hljs-string\">&quot;amount&quot;\u003C\u002Fspan>);\n            monthlySales.put(month, monthlySales.getOrDefault(month, \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>) + amount);\n        }\n        \n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;月度销售统计: &quot;\u003C\u002Fspan> + monthlySales);\n        \n        \u003Cspan class=\"hljs-comment\">\u002F\u002F 4. 找出销量最好的产品\u003C\u002Fspan>\n        Map&lt;String, Integer&gt; productSales = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        \u003Cspan class=\"hljs-keyword\">for\u003C\u002Fspan> (Map&lt;String, Object&gt; record : salesData) {\n            \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">product\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> (String) record.get(\u003Cspan class=\"hljs-string\">&quot;product&quot;\u003C\u002Fspan>);\n            \u003Cspan class=\"hljs-type\">Integer\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">amount\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> (Integer) record.get(\u003Cspan class=\"hljs-string\">&quot;amount&quot;\u003C\u002Fspan>);\n            productSales.put(product, productSales.getOrDefault(product, \u003Cspan class=\"hljs-number\">0\u003C\u002Fspan>) + amount);\n        }\n        \n        \u003Cspan class=\"hljs-type\">String\u003C\u002Fspan> \u003Cspan class=\"hljs-variable\">bestProduct\u003C\u002Fspan> \u003Cspan class=\"hljs-operator\">=\u003C\u002Fspan> Collections.max(productSales.entrySet(), Map.Entry.comparingByValue()).getKey();\n        System.out.println(\u003Cspan class=\"hljs-string\">&quot;销量最好的产品: &quot;\u003C\u002Fspan> + bestProduct + \u003Cspan class=\"hljs-string\">&quot;, 销量: &quot;\u003C\u002Fspan> + productSales.get(bestProduct));\n    }\n    \n    \u003Cspan class=\"hljs-keyword\">private\u003C\u002Fspan> \u003Cspan class=\"hljs-keyword\">static\u003C\u002Fspan> Map&lt;String, Object&gt; \u003Cspan class=\"hljs-title function_\">createRecord\u003C\u002Fspan>\u003Cspan class=\"hljs-params\">(String month, String region, String product, \u003Cspan class=\"hljs-type\">int\u003C\u002Fspan> amount)\u003C\u002Fspan> {\n        Map&lt;String, Object&gt; record = \u003Cspan class=\"hljs-keyword\">new\u003C\u002Fspan> \u003Cspan class=\"hljs-title class_\">HashMap\u003C\u002Fspan>&lt;&gt;();\n        record.put(\u003Cspan class=\"hljs-string\">&quot;month&quot;\u003C\u002Fspan>, month);\n        record.put(\u003Cspan class=\"hljs-string\">&quot;region&quot;\u003C\u002Fspan>, region);\n        record.put(\u003Cspan class=\"hljs-string\">&quot;product&quot;\u003C\u002Fspan>, product);\n        record.put(\u003Cspan class=\"hljs-string\">&quot;amount&quot;\u003C\u002Fspan>, amount);\n        \u003Cspan class=\"hljs-keyword\">return\u003C\u002Fspan> record;\n    }\n}\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003Ch2 data-line=\"555\" id=\"5. 总结与最佳实践\">5. 总结与最佳实践\u003C\u002Fh2>\n\u003Cp data-line=\"557\">Apache Commons CollectionUtils 是一个功能强大且实用的工具类，它可以显著简化集合操作代码，提高开发效率。通过本文的介绍，我们可以看到它在各种场景下的强大应用能力。\u003C\u002Fp>\n\u003Ch3 data-line=\"559\" id=\"5.1 主要优势总结\">5.1 主要优势总结\u003C\u002Fh3>\n\u003Col data-line=\"561\">\n\u003Cli data-line=\"561\">\u003Cstrong>代码简洁性\u003C\u002Fstrong>：将复杂的集合操作简化为单行方法调用，减少样板代码。\u003C\u002Fli>\n\u003Cli data-line=\"562\">\u003Cstrong>空安全\u003C\u002Fstrong>：内置对 null 值的处理，避免空指针异常。\u003C\u002Fli>\n\u003Cli data-line=\"563\">\u003Cstrong>功能全面\u003C\u002Fstrong>：提供集合运算、过滤、转换、统计等一站式解决方案。\u003C\u002Fli>\n\u003Cli data-line=\"564\">\u003Cstrong>性能优化\u003C\u002Fstrong>：经过充分测试和优化，保证执行效率。\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"566\" id=\"5.2 最佳实践建议\">5.2 最佳实践建议\u003C\u002Fh3>\n\u003Col data-line=\"568\">\n\u003Cli data-line=\"568\">\n\u003Cp data-line=\"568\">\u003Cstrong>版本选择\u003C\u002Fstrong>：优先选择 \u003Ccode>commons-collections4\u003C\u002Fcode> 而不是旧版的 \u003Ccode>commons-collections\u003C\u002Fcode>，以获得更好的泛型支持和性能。\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli data-line=\"570\">\n\u003Cp data-line=\"570\">\u003Cstrong>与 Java Stream API 的配合使用\u003C\u002Fstrong>：在 Java 8+ 环境中，可以结合使用 CollectionUtils 和 Stream API，根据具体场景选择更合适的工具。\u003C\u002Fp>\n\n        \u003Cdetails  data-line=\"571\" class=\"md-editor-code\" open=\"\">\n          \u003Csummary class=\"md-editor-code-head\">\n            \u003Cdiv class=\"md-editor-code-flag\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fdiv>\n            \u003Cdiv class=\"md-editor-code-action\">\n              \u003Cspan class=\"md-editor-code-lang\">java\u003C\u002Fspan>\n              \u003Cspan class=\"md-editor-copy-button\" data-tips=\"复制代码\">复制代码\u003C\u002Fspan>\n              \n              \u003Cspan class=\"md-editor-collapse-tips\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" class=\"lucide lucide-circle-chevron-left md-editor-icon\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"m14 16-4-4 4-4\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\n            \u003C\u002Fdiv>\n          \u003C\u002Fsummary>\n          \u003Cpre>\u003Ccode class=\"language-java\" language=java>\u003Cspan class=\"md-editor-code-block\">\u003Cspan class=\"hljs-comment\">\u002F\u002F CollectionUtils 方式\u003C\u002Fspan>\nCollectionUtils.filter(list, predicate);\n\n\u003Cspan class=\"hljs-comment\">\u002F\u002F Stream API 方式\u003C\u002Fspan>\nlist.stream().filter(predicate).collect(Collectors.toList());\u003C\u002Fspan>\u003Cspan rn-wrapper aria-hidden=\"true\">\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003Cspan>\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>\n\n        \u003C\u002Fdetails>\n      \u003C\u002Fli>\n\u003Cli data-line=\"579\">\n\u003Cp data-line=\"579\">\u003Cstrong>性能注意事项\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul data-line=\"580\">\n\u003Cli data-line=\"580\">对于大型集合，注意集合运算方法（如 \u003Ccode>union\u003C\u002Fcode>, \u003Ccode>intersection\u003C\u002Fcode>）会创建新集合，可能带来内存开销。\u003C\u002Fli>\n\u003Cli data-line=\"581\">在频繁操作的场景下，考虑使用原生循环或 Stream API 进行性能优化。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli data-line=\"583\">\n\u003Cp data-line=\"583\">\u003Cstrong>集合选择策略\u003C\u002Fstrong>：\u003C\u002Fp>\n\u003Cul data-line=\"584\">\n\u003Cli data-line=\"584\">需要有序且不重复：\u003Ccode>SetUniqueList\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli data-line=\"585\">需要计数功能：\u003Ccode>Bag\u003C\u002Fcode> 实现类\u003C\u002Fli>\n\u003Cli data-line=\"586\">需要双向映射：\u003Ccode>BidiMap\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3 data-line=\"588\" id=\"5.3 学习建议\">5.3 学习建议\u003C\u002Fh3>\n\u003Cp data-line=\"590\">对于初学者来说，建议从最常用的方法开始掌握：\u003C\u002Fp>\n\u003Col data-line=\"591\">\n\u003Cli data-line=\"591\">先熟练掌握空值判断方法（\u003Ccode>isEmpty\u003C\u002Fcode>, \u003Ccode>isNotEmpty\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli data-line=\"592\">然后学习集合运算方法（\u003Ccode>union\u003C\u002Fcode>, \u003Ccode>intersection\u003C\u002Fcode>, \u003Ccode>subtract\u003C\u002Fcode>）\u003C\u002Fli>\n\u003Cli data-line=\"593\">最后掌握过滤转换等高级功能（\u003Ccode>filter\u003C\u002Fcode>, \u003Ccode>collect\u003C\u002Fcode>）\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp data-line=\"595\">随着实践的深入，可以进一步探索 Collections 框架中的其他工具类，如 \u003Ccode>ListUtils\u003C\u002Fcode>, \u003Ccode>SetUtils\u003C\u002Fcode>, \u003Ccode>MapUtils\u003C\u002Fcode> 等，它们为特定类型的集合提供了更专业的操作方法。\u003C\u002Fp>\n\u003Cp data-line=\"597\">CollectionUtils 工具类是 Java 开发者工具箱中不可或缺的利器，合理使用它将使你的代码更加简洁、健壮和可维护。\u003C\u002Fp>\n",17481,58,"0","",2,0,16,"&quot,集合,CollectionUtils,代码,方法","1. 概述\norg.apache.commons.collections4.CollectionUtils 是 Apache Commons Collections 库中的一个核心工具类，专门用于简化 Java 集合（List、Set、Map 等）的常见操作。它提供了丰富的静态方法，涵盖了集合的空值判断、集合运算、过滤转换、比较统计等多种场景，能够显著减少冗余代码，提高开发效率和代码可读性。","2025-12-22 14:44:01"]