本文介绍如何使用 java 递归 + hashmap 构建嵌套层级结构,将点号分隔的字符串(如 "caso.responsavel.dadospessoais.nome")自动解析并组织为多级 map 树,支持任意深度嵌套,适用于动态字段路径建模场景。
在 Java 中,Collectors.groupingBy() 虽强大,但仅适用于单层分组;而面对类似 "caso.competencia.nome" 这类含多级路径的字符串,需构建树状嵌套映射(Tree-like Map),即每个节点既是键,又可作为子 Map 的容器。这无法通过标准 Stream API 直接完成,但可通过递归填充 + 泛型 Map 嵌套优雅实现。
将每个字符串按 . 拆分为路径数组(如 "caso.responsavel.dadosPessoais.nome" → ["caso", "responsavel", "dadosPessoais", "nome"]),再逐级下沉插入到嵌套 Map
import java.util.*;
public class NestedStringGrouping {
public static void main(String[] args) {
String[] array = {
"caso.id", "caso.unidadeDoCaso.id", "caso.etiqueta",
"caso.sigiloso", "caso.idPecaSegredoJustica", "caso.numeroAno",
"caso.numero", "caso.competencia.id", "caso.competencia.ativo",
"caso.competencia.nome", "caso.responsavel.id",
"caso.responsavel.dadosPessoais.nome", "caso.escrivao.id",
"caso.escrivao.dadosPessoais.nome"
};
Map root = new HashMap<>();
for (String path : array) {
String[] nodes = path.split("\\.");
fill(root, nodes, 0);
}
System.out.println("Nested structure:");
pr
int(root, "");
}
// 递归填充:将 nodes[i..end] 路径插入到 map 中
public static void fill(Map map, String[] nodes, int i) {
if (i >= nodes.length) return;
String key = nodes[i];
Object existing = map.get(key);
if (existing == null) {
// 当前层级不存在 → 创建新子 Map 并挂载
Map subMap = new HashMap<>();
map.put(key, subMap);
fill(subMap, nodes, i + 1); // 继续向下构建
} else if (existing instanceof Map) {
// 已存在子 Map → 继续递归填充
@SuppressWarnings("unchecked")
Map subMap = (Map) existing;
fill(subMap, nodes, i + 1);
}
// 若 existing 非 Map(如已存为 String),此处可抛异常或覆盖逻辑(本例仅建结构,无需值)
}
// 递归打印:缩进显示层级关系
public static void print(Map map, String indent) {
for (String key : map.keySet()) {
System.out.println(indent + key);
Object value = map.get(key);
if (value instanceof Map) {
print((Map) value, indent + " ");
}
}
}
} 虽然 Java Stream 不直接支持“递归 groupingBy”,但结合 split()、HashMap 和简洁递归,我们能以不到 30 行核心逻辑实现任意深度的嵌套字符串分组。它不依赖第三方库,语义清晰,且易于单元测试与定制 —— 是处理动态路径建模的经典轻量方案。