在 Java 开发中,集合框架是处理数据的核心工具。然而,标准 Java 集合框架虽然功能强大,但在某些场景下仍显得不够灵活。Apache Commons Collections 4(以下简称 commons-collections4
)作为一个强大的工具库,为开发者提供了丰富的实用工具类和扩展集合类型,极大地增强了 Java 集合框架的功能。下面将深入探讨 commons-collections4
的核心功能,并通过实际示例展示其强大的功能。
1. 什么是 Apache Commons Collections 4?
commons-collections4
是 Apache Commons 项目的一部分,旨在为 Java 标准集合框架提供额外的功能和扩展。它包含了许多实用的工具类和集合类型,涵盖了集合操作、集合转换、集合过滤、集合排序等多个方面。通过使用 commons-collections4
,开发者可以更高效地处理集合数据,减少重复代码的编写,提高代码的可读性和可维护性。
2. 引入依赖
首先,你需要在你的项目中引入 Apache Commons Collections 4 库。如果你使用 Maven 构建项目,可以在 pom.xml 文件中添加以下依赖:
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
3. 核心功能概览
3.1 集合工具类
CollectionUtils
是 commons-collections4
中最常用的工具类之一。它提供了丰富的集合操作方法,例如:
- 集合判空:
isEmpty
、isNotEmpty
- 集合合并:
union
、intersection
、disjunction
- 集合过滤:
select
、filter
- 集合转换:
collect
3.1.1 集合判空
在处理集合时,我们经常需要判断集合是否为空。CollectionUtils提供了两个非常方便的方法:isEmpty 和 isNotEmpty。
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
public class CollectionUtils01 {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
if (CollectionUtils.isEmpty(list)) {
System.out.println("List is empty");
}
if (CollectionUtils.isNotEmpty(list)) {
System.out.println("List is not empty");
}
}
}
3.1.2 集合合并
3.1.2.1 union
union
方法用于计算两个集合的并集。
import org.apache.commons.collections4.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CollectionUtilsUnion {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(3, 4, 5);
Collection<Integer> union = CollectionUtils.union(list1, list2);
System.out.println(union); // 输出: [1, 2, 3, 4, 5]
}
}
3.1.2.2 intersection
intersection
方法用于计算两个集合的交集。
import org.apache.commons.collections4.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CollectionUtilsIntersection {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(3, 4, 5);
Collection<Integer> intersection = CollectionUtils.intersection(list1, list2);
System.out.println(intersection); // 输出: [3]
}
}
3.1.2.3 subtract
subtract
方法用于计算两个集合的差集。
import org.apache.commons.collections4.CollectionUtils;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CollectionUtilsSubtract {
public static void main(String[] args) {
List<Integer> list1 = Arrays.asList(1, 2, 3);
List<Integer> list2 = Arrays.asList(3, 4, 5);
Collection<Integer> subtract = CollectionUtils.subtract(list1, list2);
System.out.println(subtract); // 输出: [1, 2]
}
}
3.1.3 集合过滤 select
和 filter
select
和 filter
方法用于根据指定的条件过滤集合中的元素。
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Predicate;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CollectionUtils03 {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
Predicate<Integer> isEven = n -> n % 2 == 0;
Collection<Integer> evenNumbers = CollectionUtils.select(numbers, isEven);
System.out.println(evenNumbers); // 输出: [2, 4]
}
}
3.1.4 集合转换
collect
方法用于将集合中的元素转换为另一种类型。
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.Transformer;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
public class CollectionUtils04 {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Transformer<String, Integer> lengthTransformer = String::length;
Collection<Integer> lengths = CollectionUtils.collect(names, lengthTransformer);
System.out.println(lengths); // 输出: [5, 3, 7]
}
}
3.2 映射(Map)操作
Apache Commons Collections 4库中的MapUtils
类为我们提供了一系列实用的工具方法,可以极大地简化映射操作的复杂性。它提供了丰富的映射操作方法,例如:
- 判断映射是否为空:
isEmpty
、isNotEmpty
- 映射中获取值:
getInteger
、getLong
、getDouble
和getString
- 安全添加键值对到映射:
safeAddToMap
- 反转映射:
invertMap
3.2.1 判断映射是否为空
在处理映射时,我们经常需要判断映射是否为空。MapUtils
提供了两个非常方便的方法:isEmpty
和 isNotEmpty
。
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtils01 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
if (MapUtils.isEmpty(map)) {
System.out.println("Map is empty");
}
if (MapUtils.isNotEmpty(map)) {
System.out.println("Map is not empty");
}
}
}
3.2.2 映射中获取值
MapUtils
提供了一些方法来从映射中获取值,并将其转换为相应的类型。这些方法在获取值时会进行类型检查,如果类型不匹配,则返回默认值。
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtils02 {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
map.put("age", 30);
map.put("height", 175.5);
map.put("name", "Alice");
Integer age = MapUtils.getInteger(map, "age");
Double height = MapUtils.getDouble(map, "height");
String name = MapUtils.getString(map, "name");
System.out.println("Age: " + age); // 输出: Age: 30
System.out.println("Height: " + height); // 输出: Height: 175.5
System.out.println("Name: " + name); // 输出: Name: Alice
}
}
3.2.3 安全添加键值对到映射
safeAddToMap
方法用于安全地将键值对添加到映射中,避免覆盖已有的键值对。
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtils03 {
public static void main(String[] args) {
Map<String, Object> map = new HashMap<>();
MapUtils.safeAddToMap(map, "name", "Alice");
MapUtils.safeAddToMap(map, "age", 30);
System.out.println(map); // 输出: {name=Alice, age=30}
}
}
3.2.4 反转映射
invertMap
方法用于反转映射,即将键和值互换。
import org.apache.commons.collections4.MapUtils;
import java.util.HashMap;
import java.util.Map;
public class MapUtils04 {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("one", 1);
map.put("two", 2);
Map<Integer, String> invertedMap = MapUtils.invertMap(map);
System.out.println(invertedMap); // 输出: {1=one, 2=two}
}
}
3.3 扩展集合类型
commons-collections4
提供了许多扩展集合类型,例如:
- 双向映射:
BidiMap
- 有序映射:
OrderedMap
- 多值映射:
MultiValuedMap
import org.apache.commons.collections4.BidiMap;
import org.apache.commons.collections4.bidimap.DualHashBidiMap;
import org.apache.commons.collections4.map.LinkedMap;
import org.apache.commons.collections4.multimap.ArrayListValuedHashMap;
import org.apache.commons.collections4.MultiValuedMap;
public class ExtendedCollectionsExample {
public static void main(String[] args) {
// 双向映射
BidiMap<String, Integer> bidiMap = new DualHashBidiMap<>();
bidiMap.put("Alice", 30);
bidiMap.put("Bob", 25);
System.out.println(bidiMap.get("Alice")); // 30
System.out.println(bidiMap.getKey(25)); // Bob
// 有序映射
LinkedMap<String, Integer> orderedMap = new LinkedMap<>();
orderedMap.put("Alice", 30);
orderedMap.put("Bob", 25);
orderedMap.put("Charlie", 35);
System.out.println(orderedMap.firstKey()); // Alice
System.out.println(orderedMap.nextKey("Alice")); // Bob
// 多值映射
MultiValuedMap<String, String> multiValuedMap = new ArrayListValuedHashMap<>();
multiValuedMap.put("Alice", "Java");
multiValuedMap.put("Alice", "Python");
multiValuedMap.put("Bob", "C++");
System.out.println(multiValuedMap.get("Alice")); // [Java, Python]
}
}
4. 总结
Apache Commons Collections 4 是一个功能强大且易于使用的工具库,为 Java 开发者提供了丰富的实用工具类和扩展集合类型。通过使用 commons-collections4
,开发者可以显著提高代码的简洁性和可读性,减少重复劳动,从而专注于业务逻辑的实现。无论是处理集合操作、集合转换,还是进行集合排序和迭代操作,commons-collections4
都能提供便捷的解决方案。