在日常开发中,我们经常需要对 Map 或者 Multimap 做一些常见操作,比如批量取值、查找并处理、列表转 Map 等。
为了避免重复造轮子,本文将介绍一个非常实用的工具类 —— MapUtils,并通过示例来帮助你快速掌握它的用法。
1. 工具类简介
MapUtils 提供了以下三个核心方法:
-
getList(Multimap<K, V> multimap, Collection<K> keys)
批量从Multimap中根据多个key获取所有的value。 -
findAndThen(Map<K, V> map, K key, Consumer<V> consumer)
从Map中找到指定key的value,并对其进一步处理。 -
convertMap(List<KeyValue<K, V>> keyValues)
将KeyValue列表快速转换成Map。
2. 方法详解与示例
2.1 getList —— 批量取值
方法签名:
public static <K, V> List<V> getList(Multimap<K, V> multimap, Collection<K> keys)
-
用途:从一个
Multimap中,拿到多个key对应的所有value。 -
参数:
multimap:一个key可以对应多个value的哈希表。keys:你想要批量取值的 key 集合。
-
返回:所有找到的 value 的集合。
示例:
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
Multimap<String, String> multimap = ArrayListMultimap.create();
multimap.put("fruit", "apple");
multimap.put("fruit", "banana");
multimap.put("drink", "coffee");
multimap.put("drink", "tea");
List<String> values = MapUtils.getList(multimap, Arrays.asList("fruit", "drink"));
System.out.println(values); // 输出 [apple, banana, coffee, tea]
}
}
✅ 这样就能一行代码搞定批量取值,避免手动循环。
2.2 findAndThen —— 查找并处理
方法签名:
public static <K, V> void findAndThen(Map<K, V> map, K key, Consumer<V> consumer)
-
用途:根据 key 从 map 找到 value,并对 value 做进一步处理。
-
特点:
- 如果
key是null,直接返回,不处理。 - 如果找不到
value,也不处理。
- 如果
示例:
import java.util.HashMap;
import java.util.Map;
public class Test {
public static void main(String[] args) {
Map<Integer, String> map = new HashMap<>();
map.put(1, "Tom");
map.put(2, "Jerry");
// 查找 key=1 并打印
MapUtils.findAndThen(map, 1, value -> {
System.out.println("找到的值是:" + value);
});
// 查找 key=3,不存在,所以不会执行 consumer
MapUtils.findAndThen(map, 3, value -> {
System.out.println("永远不会执行");
});
}
}
输出:
找到的值是:Tom
✅ 好处是不用写一堆 if 判断,代码更简洁。
2.3 convertMap —— 列表转 Map
方法签名:
public static <K, V> Map<K, V> convertMap(List<KeyValue<K, V>> keyValues)
- 用途:把一个
KeyValue对象的列表转换成Map。 - 场景:比如你从数据库查到的配置列表,需要快速转换成 Map 使用。
示例:
import cn.iocoder.yudao.framework.common.core.KeyValue;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class Test {
public static void main(String[] args) {
List<KeyValue<String, String>> list = Arrays.asList(
new KeyValue<>("name", "Alice"),
new KeyValue<>("age", "20"),
new KeyValue<>("city", "Beijing")
);
Map<String, String> map = MapUtils.convertMap(list);
System.out.println(map);
}
}
输出:
{name=Alice, age=20, city=Beijing}
✅ 比手动写循环 put 更方便。
3. 总结
MapUtils 提供了对 Map 和 Multimap 的常见操作封装,使用起来非常简洁:
getList:批量取值,省掉循环。findAndThen:查找并执行逻辑,避免 if-else 嵌套。convertMap:快速把KeyValue列表转成 Map。
如果你经常和 Map 打交道,可以把这个工具类放到自己的项目里,日常开发效率会提升不少。
package cn.iocoder.yudao.framework.common.util.collection;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjUtil;
import cn.iocoder.yudao.framework.common.core.KeyValue;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
/**
* Map 工具类
*
* @author 芋道源码
*/
public class MapUtils {
/**
* 从哈希表表中,获得 keys 对应的所有 value 数组
*
* @param multimap 哈希表
* @param keys keys
* @return value 数组
*/
public static <K, V> List<V> getList(Multimap<K, V> multimap, Collection<K> keys) {
List<V> result = new ArrayList<>();
keys.forEach(k -> {
Collection<V> values = multimap.get(k);
if (CollectionUtil.isEmpty(values)) {
return;
}
result.addAll(values);
});
return result;
}
/**
* 从哈希表查找到 key 对应的 value,然后进一步处理
* key 为 null 时, 不处理
* 注意,如果查找到的 value 为 null 时,不进行处理
*
* @param map 哈希表
* @param key key
* @param consumer 进一步处理的逻辑
*/
public static <K, V> void findAndThen(Map<K, V> map, K key, Consumer<V> consumer) {
if (ObjUtil.isNull(key) || CollUtil.isEmpty(map)) {
return;
}
V value = map.get(key);
if (value == null) {
return;
}
consumer.accept(value);
}
public static <K, V> Map<K, V> convertMap(List<KeyValue<K, V>> keyValues) {
Map<K, V> map = Maps.newLinkedHashMapWithExpectedSize(keyValues.size());
keyValues.forEach(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
return map;
}
}

被折叠的 条评论
为什么被折叠?



