文章目录
MapUtils
是 Apache Commons Collections 库中的一个核心工具类,用于简化对 Map
的操作。它提供了丰富的静态方法,涵盖 空值判断、值获取、类型转换、不可变Map创建、集合操作 等常见任务,显著减少冗余代码并提高开发效率。
一、依赖引入
使用 MapUtils
需要引入 Apache Commons Collections 的依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
二、核心方法分类及示例
1. 空值判断
1.1 isEmpty(Map<?, ?> map)
- 功能:判断
Map
是否为null
或空(即不包含任何键值对)。 - 示例:
Map<String, String> map = new HashMap<>(); boolean isEmpty = MapUtils.isEmpty(map); // true
1.2 isNotEmpty(Map<?, ?> map)
- 功能:判断
Map
是否非空。 - 示例:
Map<String, String> map = new HashMap<>(); map.put("key", "value"); boolean isNotEmpty = MapUtils.isNotEmpty(map); // true
1.3 emptyIfNull(Map<K, V> map)
- 功能:若
Map
为null
,返回空集合;否则返回原集合。 - 示例:
Map<String, String> safeMap = MapUtils.emptyIfNull(null); System.out.println(safeMap); // {}
2. 值获取与类型转换
2.1 getString(Map<?, ?> map, Object key)
- 功能:从
Map
中获取String
类型的值。 - 示例:
Map<String, Object> map = new HashMap<>(); map.put("name", "John"); String name = MapUtils.getString(map, "name"); // "John"
2.2 getString(Map<?, ?> map, Object key, String defaultValue)
- 功能:获取
String
类型值,并指定默认值。 - 示例:
String name = MapUtils.getString(map, "age", "Unknown"); // "Unknown"
2.3 getInteger(Map<?, ?> map, Object key)
- 功能:获取
Integer
类型值。 - 示例:
Map<String, Object> map = new HashMap<>(); map.put("age", 25); Integer age = MapUtils.getInteger(map, "age"); // 25
2.4 getInteger(Map<?, ?> map, Object key, Integer defaultValue)
- 功能:获取
Integer
类型值,并指定默认值。 - 示例:
Integer money = MapUtils.getInteger(map, "money", 100); // 100
2.5 其他类型转换方法
方法名 | 功能 |
---|---|
getBoolean | 获取 Boolean 类型值 |
getLong | 获取 Long 类型值 |
getFloat | 获取 Float 类型值 |
getDouble | 获取 Double 类型值 |
getNumber | 获取 Number 类型值 |
getObject | 获取任意类型的值 |
3. Map 操作
3.1 putAll(Map<K, V> target, Map<? extends K, ? extends V> source)
- 功能:将
source
的键值对添加到target
中。 - 示例:
Map<String, String> source = new HashMap<>(); source.put("key1", "value1"); Map<String, String> target = new HashMap<>(); MapUtils.putAll(target, source); System.out.println(target); // {key1=value1}
3.2 putAll(Map<K, V> target, Object... keyValuePairs)
- 功能:将键值对数组添加到
target
中。 - 示例:
Map<String, String> map = new HashMap<>(); MapUtils.putAll(map, "color", "red", "size", "XL"); System.out.println(map); // {color=red, size=XL}
3.3 invertMap(Map<K, V> map)
- 功能:返回一个键值对调的新
Map
。 - 示例:
Map<String, String> map = new HashMap<>(); map.put("RED", "#FF0000"); Map<String, String> inverted = MapUtils.invertMap(map); System.out.println(inverted); // {#FF0000=RED}
4. 不可变 Map 创建
4.1 unmodifiableMap(Map<K, V> map)
- 功能:创建一个不可变的
Map
。 - 示例:
Map<String, String> unmodifiable = MapUtils.unmodifiableMap(map); unmodifiable.put("newKey", "newValue"); // 抛出 UnsupportedOperationException
4.2 fixedSizeMap(Map<K, V> map)
- 功能:创建一个固定大小的
Map
(不可新增或删除元素)。 - 示例:
Map<String, String> fixedMap = MapUtils.fixedSizeMap(new HashMap<>()); fixedMap.put("key", "value"); fixedMap.remove("key"); // 抛出 UnsupportedOperationException
5. 多值 Map 操作
5.1 multiValueMap()
- 功能:创建一个支持多值的
Map
(一个键对应多个值)。 - 示例:
MultiValuedMap<String, String> multiMap = new ArrayListValuedHashMap<>(); multiMap.put("fruits", "apple"); multiMap.put("fruits", "banana"); System.out.println(multiMap.get("fruits")); // [apple, banana]
6. 其他实用方法
6.1 transformedMap(Map<K, V> map, Transformer<V, V> valueTransformer)
- 功能:对
Map
的值进行转换。 - 示例:
Map<String, String> transformedMap = MapUtils.transformedMap( new HashMap<>(), value -> value.toUpperCase() ); transformedMap.put("key", "value"); System.out.println(transformedMap.get("key")); // "VALUE"
6.2 synchronizedMap(Map<K, V> map)
- 功能:创建线程安全的
Map
。 - 示例:
Map<String, String> synchronizedMap = MapUtils.synchronizedMap(new HashMap<>());
三、典型应用场景
1. 获取默认值
Map<String, Object> user = new HashMap<>();
user.put("name", "Alice");
String name = MapUtils.getString(user, "name", "Unknown"); // "Alice"
int age = MapUtils.getInteger(user, "age", 18); // 18
2. 合并 Map
Map<String, String> map1 = MapUtils.putAll(new HashMap<>(), "color", "red", "size", "XL");
Map<String, String> map2 = MapUtils.putAll(new HashMap<>(), "material", "cotton");
Map<String, String> merged = new HashMap<>(map1);
MapUtils.putAll(merged, map2);
System.out.println(merged); // {color=red, size=XL, material=cotton}
3. 键值对调
Map<String, String> colorMap = new HashMap<>();
colorMap.put("RED", "#FF0000");
colorMap.put("GREEN", "#00FF00");
Map<String, String> inverted = MapUtils.invertMap(colorMap);
System.out.println(inverted.get("#FF0000")); // "RED"
四、MapUtils全部方法列表
方法名 | 功能 |
---|---|
isEmpty(Map<?, ?> map) | 判断 Map 是否为空 |
isNotEmpty(Map<?, ?> map) | 判断 Map 是否非空 |
emptyIfNull(Map<K, V> map) | 若 Map 为 null ,返回空集合 |
getString(Map<?, ?> map, Object key) | 获取 String 类型值 |
getString(Map<?, ?> map, Object key, String defaultValue) | 获取 String 类型值并指定默认值 |
getInteger(Map<?, ?> map, Object key) | 获取 Integer 类型值 |
getInteger(Map<?, ?> map, Object key, Integer defaultValue) | 获取 Integer 类型值并指定默认值 |
putAll(Map<K, V> target, Map<? extends K, ? extends V> source) | 合并两个 Map |
putAll(Map<K, V> target, Object... keyValuePairs) | 添加键值对数组到 Map |
invertMap(Map<K, V> map) | 返回键值对调的新 Map |
unmodifiableMap(Map<K, V> map) | 创建不可变 Map |
fixedSizeMap(Map<K, V> map) | 创建固定大小的 Map |
transformedMap(Map<K, V> map, Transformer<V, V> valueTransformer) | 转换 Map 的值 |
synchronizedMap(Map<K, V> map) | 创建线程安全的 Map |
multiValueMap() | 创建支持多值的 Map (需使用 MultiValuedMap ) |
五、注意事项与最佳实践
-
依赖版本:
- 使用
commons-collections4
,避免与旧版本commons-collections
冲突。
- 使用
-
类型安全:
- 在获取值时,确保键的类型与
Map
的键类型一致,避免类型转换异常。
- 在获取值时,确保键的类型与
-
不可变集合:
- 使用
unmodifiableMap
后,尝试修改Map
会抛出UnsupportedOperationException
。
- 使用
-
性能优化:
- 避免频繁使用
invertMap
或transformedMap
,这些方法会创建新集合。
- 避免频繁使用
-
默认值处理:
- 使用带默认值的方法(如
getString(..., "default")
)避免NullPointerException
。
- 使用带默认值的方法(如
六、总结
MapUtils
是 Apache Commons Collections 中不可或缺的工具类,极大简化了 Java Map
的常见操作。通过其丰富的 API,开发者可以轻松实现 空值判断、值获取、类型转换、不可变Map创建、集合操作 等功能。在实际开发中,合理使用 MapUtils
能显著提升代码的简洁性和可维护性。