本文介绍如何将形如 "caso.responsavel.dadosPessoais.nome" 的点号分隔字符串列表,递归构建成嵌套的 `Map
在 Java 开发中,常需将

caso
id
responsavel
dadosPessoais
nome这无法通过单层 Collectors.groupingBy() 实现,而需结合递归建模 + 动态嵌套 Map。下面提供一套简洁、可复用、类型安全的解决方案。
import java.util.*;
public class NestedGrouping {
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);
}
print(root, "");
}
// 递归构建嵌套 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 child = new HashMap<>();
map.put(key, child);
fill(child, nodes, i + 1);
} else if (existing instanceof Map) {
// 已存在子 Map,继续递归
@SuppressWarnings("unchecked")
Map child = (Map) existing;
fill(child, nodes, i + 1);
}
// ⚠️ 注意:若 existing 非 null 且非 Map(如冲突路径),此处可抛异常或忽略(本例视为合法结构)
}
// 递归打印,带缩进层次
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 + " ");
}
}
}
} caso
id
unidadeDoCaso
id
etiqueta
sigiloso
idPecaSegredoJustica
numeroAno
numero
competencia
id
ativo
nome
responsavel
id
dadosPessoais
nome
escrivao
id
dadosPessoais
nome此方案轻量、无外部依赖、逻辑清晰,适用于权限字段过滤、动态表单生成、API 响应结构推导等典型场景。