Map 工具 - MapUtil / BiMap

由来

提供 Map(字典)的增强操作,包括判空、转换、过滤、排序等。BiMap 提供双向查找的映射关系。

MapUtil

判空

from hutool import MapUtil

MapUtil.is_empty({})        # True
MapUtil.is_not_empty({"a": 1})  # True

创建

MapUtil.of("key", "value")                   # {"key": "value"}
MapUtil.of_entries(("a", 1), ("b", 2))       # {"a": 1, "b": 2}
MapUtil.of_array(["a", 1, "b", 2])           # {"a": 1, "b": 2}

转换

# 列表转 Map
MapUtil.to_list_map([{"type": "a", "val": 1}, {"type": "a", "val": 2}])
# {"a": [{"type": "a", "val": 1}, {"type": "a", "val": 2}]}

# 驼峰转换
MapUtil.to_camel_case_map({"first_name": "John"})
# {"firstName": "John"}

# 转为二维数组
MapUtil.to_object_array({"a": 1, "b": 2})
# [["a", 1], ["b", 2]]

# 连接
MapUtil.join({"a": 1, "b": 2}, "&", "=")  # "a=1&b=2"
MapUtil.sort_join({"b": 2, "a": 1}, "&", "=")  # "a=1&b=2"(按键排序)

# 拼接(忽略 null 值)
MapUtil.join_ignore_null({"a": 1, "b": None, "c": 3})
# "a=1&c=3"

操作

# 过滤
MapUtil.filter({"a": 1, "b": 2, "c": 3}, "a", "c")  # {"a": 1, "c": 3}
MapUtil.filter_by_func({"a": 1, "b": 2, "c": 3}, lambda k, v: v > 1)
# {"b": 2, "c": 3}

# 映射值
MapUtil.map_values({"a": 1, "b": 2}, lambda v: v * 10)
# {"a": 10, "b": 20}

# 排序
MapUtil.sort({"b": 2, "a": 1, "c": 3})         # 按键排序
MapUtil.sort_by_value({"a": 3, "b": 1, "c": 2}) # 按值排序

# 反转
MapUtil.inverse({"a": 1, "b": 2})  # {1: "a", 2: "b"}

# 取值最大的前 N 个键
MapUtil.top_n_keys({"a": 3, "b": 1, "c": 5, "d": 2}, 2)  # ["c", "a"]

# 键操作
MapUtil.rename_key({"old": 1}, "old", "new")  # {"new": 1}

# 过滤/删除
m = {"a": 1, "b": None, "c": 3}
MapUtil.remove_null_value(m)  # m 变为 {"a": 1, "c": 3}
MapUtil.remove_by_value({"a": 1, "b": 2}, 1)  # {"b": 2}
MapUtil.remove_if({"a": 1, "b": 2}, lambda k, v: v > 1)  # {"a": 1}

# 分割/扁平化
MapUtil.partition({"a": 1, "b": 2, "c": 3, "d": 4}, 2)
# [{"a": 1, "b": 2}, {"c": 3, "d": 4}]

MapUtil.flatten({"a": {"b": 1, "c": {"d": 2}}, "e": 3})
# {"a.b": 1, "a.c.d": 2, "e": 3}

# 值映射
MapUtil.edit({"a": 1, "b": 2}, lambda k, v: v * 10)  # {"a": 10, "b": 20}
MapUtil.map_({"a": 1}, key_func=str.upper, value_func=lambda v: v * 2)
# {"A": 2}

# 惰性计算
m = {}
MapUtil.compute_if_absent(m, "key", lambda k: 42)  # m["key"] = 42

安全取值

data = {"name": "test", "count": "5", "active": "true"}

MapUtil.get_str(data, "name")                   # "test"
MapUtil.get_str(data, "missing", "")            # ""
MapUtil.get_int(data, "count")                  # 5
MapUtil.get_float(data, "count")                # 5.0
MapUtil.get_bool(data, "active")                # True
MapUtil.get_any({"a": 1, "b": 2}, "x", "b")     # 2
MapUtil.get_double({"a": "2.5"}, "a")           # 2.5
MapUtil.get_long({"a": "2"}, "a")               # 2

BiMap

双向 Map,支持通过键查值和通过值查键:

from hutool import BiMap

bi_map = BiMap()
bi_map.put("a", 1)
bi_map.put("b", 2)

bi_map.get("a")          # 1
bi_map.inverse().get(1)  # "a"

分割与排序

# splitBySize — 按大小分割 Map
MapUtil.split_by_size({"a": 1, "b": 2, "c": 3, "d": 4}, 2)
# [{"a": 1, "b": 2}, {"c": 3, "d": 4}]

# sortByKey — 按键排序
MapUtil.sort_by_key({"b": 2, "a": 1, "c": 3})
# {"a": 1, "b": 2, "c": 3}

值分组

# toMapList — 按值分组(返回 list)
MapUtil.to_map_list({"a": 1, "b": 2, "c": 1}, lambda k, v: v)
# {1: ["a", "c"], 2: ["b"]}