如何将嵌套结构的Map转换为扁平String列表?
解决方案
首先明确你的数据结构:顶层Map<String, Object>中,"data"键对应的值是另一个Map<String, Object>,该内层Map包含"contacts"(List<String>类型)和"phone"(String类型)两个键。
你之前的代码直接收集外层Map的values,会把整个contacts列表作为单个元素加入结果,无法实现扁平化。要解决这个问题,需要遍历内层Map的values,通过flatMap将列表展开,同时保留单个字符串元素:
// 先获取内层的data Map Map<String, Object> innerData = (Map<String, Object>) data.get("data"); // 扁平化处理得到目标列表 List<String> expectedOutput = innerData.values().stream() .flatMap(value -> { // 处理List类型的元素,展开并转换为String流 if (value instanceof List<?>) { return ((List<?>) value).stream() .filter(String.class::isInstance) .map(String.class::cast); } // 处理单个String元素,转为单元素流 else if (value instanceof String) { return Stream.of((String) value); } // 其他类型元素忽略,返回空流 return Stream.empty(); }) .collect(Collectors.toList());
代码说明
flatMap的作用是将每个元素(无论是列表还是单个字符串)都转换为流,再合并成一个统一的流;- 对List类型的元素,先过滤确保其中的元素都是String类型,再转换为String流;
- 对单个String元素,直接包装成单元素流;
- 最后通过
collect(Collectors.toList())收集所有元素,得到你需要的扁平字符串列表。
内容的提问来源于stack exchange,提问作者coding2
相关产品推荐
相关产品推荐

