【Java第67集】java MapUtils工具类详解

MapUtilsApache 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)

  • 功能:若 Mapnull,返回空集合;否则返回原集合。
  • 示例
    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)Mapnull,返回空集合
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

五、注意事项与最佳实践

  1. 依赖版本

    • 使用 commons-collections4,避免与旧版本 commons-collections 冲突。
  2. 类型安全

    • 在获取值时,确保键的类型与 Map 的键类型一致,避免类型转换异常。
  3. 不可变集合

    • 使用 unmodifiableMap 后,尝试修改 Map 会抛出 UnsupportedOperationException
  4. 性能优化

    • 避免频繁使用 invertMaptransformedMap,这些方法会创建新集合。
  5. 默认值处理

    • 使用带默认值的方法(如 getString(..., "default"))避免 NullPointerException

六、总结

MapUtils 是 Apache Commons Collections 中不可或缺的工具类,极大简化了 Java Map 的常见操作。通过其丰富的 API,开发者可以轻松实现 空值判断、值获取、类型转换、不可变Map创建、集合操作 等功能。在实际开发中,合理使用 MapUtils 能显著提升代码的简洁性和可维护性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值