Maps
Maps 是平台里非常常用的 一组 Map 工具方法,既适合普通后端代码,也很适合脚本、配置处理和 JSON 结构转换场景。
Maven 包: com.ouroboros:ouroboros-util
Java 包: com.ouroboros.util
什么时候看这页
- 你在处理
Map<String, Object>这类弱结构数据 - 你想做 Map 合并、筛选、重映射或嵌套路径读写
- 你要在 Bean 和 Map 之间互转
先理解这页的定位
Maps 源码非常长,能力覆盖也很多。这页不打算把每个重载方法逐个展开,而是帮你先定位“该用哪一类方法”。
如果你已经明确知道要用某个方法名,再回源码或 IDE 自动补全里查重载会更快。
最常用的几类能力
| 类别 | 代表方法 | 适用场景 |
|---|---|---|
| 基础判断 | containsKey、isEmpty、isNotEmpty | 安全判断 Map 状态 |
| 重映射 | remap、transform | 改 key、改 value 或两者一起改 |
| 合并 | merge、mergeTo、deepMerge | 合并多个 Map |
| 过滤 | pick、omit、remove、removeExcept | 只保留或删除一部分字段 |
| 读取与写入 | getAs、putIfAbsentAll、putIf | 安全读写 |
| 结构转换 | toBean、fromBean | Bean 和 Map 互转 |
| 嵌套 Map | Maps.Hierarchical.build、flatten、getValue、setValue | 处理嵌套路径结构 |
基础判断
| 方法 | 返回值类型 | 说明 |
|---|---|---|
isStringKeyMap(Map<?, ?> map) | boolean | 判断是否为字符串键 Map |
containsKey(Map<K, ?> map, K key) | boolean | 安全判断是否包含某个 key |
isEmpty(Map<?, ?> map) | boolean | null 或空 Map 都返回 true |
isNotEmpty(Map<?, ?> map) | boolean | isEmpty 的相反语义 |
if (Maps.isEmpty(config)) {
return;
}
重映射与转换
remap
remap 适合把 Map 的 key 或 value 改成另一种结构。
Map<String, Integer> result = Maps.remap(source, Object::toString, String::length);
它有多种重载:
- 只改 key
- 根据 key 和 value 一起改 key
- 同时改 key 和 value
transform
transform 也适合做结构变换,通常用于把一种 Map 结构映射成另一种类型结构。
如果你只是做简单 key/value 改写,通常先从 remap 开始就够了。
合并
| 方法 | 说明 |
|---|---|
mergeTo(target, ...) | 把多个 Map 合并进已有目标 Map |
merge(...) | 合并多个 Map 并返回新 Map |
deepMergeTo(target, ...) | 深度合并到目标 Map |
deepMerge(...) | 返回深度合并后的新 Map |
什么时候用 merge
只需要顶层字段合并,后来的值覆盖前面的值时,用 merge / mergeTo。
什么时候用 deepMerge
值本身还是 Map,希望递归合并子层级时,用 deepMerge / deepMergeTo。
Map<String, Object> merged = Maps.deepMerge(defaultConfig, appConfig, runtimeConfig);
这类方法在配置、Schema、前后端透传对象处理中非常常见。
过滤与裁剪
| 方法 | 说明 |
|---|---|
pick(...) | 只保留满足条件或指定 key 的字段 |
omit(...) | 返回排除指定字段后的新 Map |
remove(...) | 直接从原 Map 删除满足条件的字段 |
removeExcept(...) | 直接从原 Map 删除“不满足条件”的字段 |
一个简单的判断方式:
- 想返回一个新 Map:优先看
pick/omit - 想原地修改已有 Map:优先看
remove/removeExcept
Map<String, Object> safe = Maps.omit(payload, List.of("password", "secret"));