Java Map 工具类详解 —— MapUtils 使用指南

在日常开发中,我们经常需要对 Map 或者 Multimap 做一些常见操作,比如批量取值、查找并处理、列表转 Map 等。
为了避免重复造轮子,本文将介绍一个非常实用的工具类 —— MapUtils,并通过示例来帮助你快速掌握它的用法。


1. 工具类简介

MapUtils 提供了以下三个核心方法:

  1. getList(Multimap<K, V> multimap, Collection<K> keys)
    批量从 Multimap 中根据多个 key 获取所有的 value

  2. findAndThen(Map<K, V> map, K key, Consumer<V> consumer)
    Map 中找到指定 keyvalue,并对其进一步处理。

  3. 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 做进一步处理。

  • 特点

    • 如果 keynull,直接返回,不处理。
    • 如果找不到 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 提供了对 MapMultimap 的常见操作封装,使用起来非常简洁:

  • 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;
    }

}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值