如何在Java Stream中使用flatMap展平HashMap的列表值为单个列表
使用Java Stream的flatMap实现列表扁平化
问题场景
现有如下Java代码定义的Map列表:
List<Map<String, Object>> list = new ArrayList(); Map<String, Object> map1 = new HashMap(); List<String> values = new ArrayList(); values.add("TEST"); values.add("TEST1"); map1.put("level", values); Map<String, Object> map2 = new HashMap(); List<String> values2 = new ArrayList(); values2.add("TEST2"); values2.add("TEST3"); map2.put("level", values2); list.add(map1); list.add(map2);
需要将其转换为一个扁平化的字符串列表,最终结果如下:
List<String> values = ["TEST","TEST1","TEST2","TEST3"]
实现方案
可以通过Java Stream的flatMap方法实现该需求,核心是将每个Map中对应的列表元素"摊平"后收集到一个新列表中,代码示例如下:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class FlatMapExample { public static void main(String[] args) { List<Map<String, Object>> list = new ArrayList(); Map<String, Object> map1 = new HashMap(); List<String> values = new ArrayList(); values.add("TEST"); values.add("TEST1"); map1.put("level", values); Map<String, Object> map2 = new HashMap(); List<String> values2 = new ArrayList(); values2.add("TEST2"); values2.add("TEST3"); map2.put("level", values2); list.add(map1); list.add(map2); // 核心实现代码 List<String> flatValues = list.stream() .map(map -> (List<String>) map.get("level")) .flatMap(List::stream) .collect(Collectors.toList()); System.out.println(flatValues); // 输出: [TEST, TEST1, TEST2, TEST3] } }
代码解释
list.stream():将原始的List<Map<String, Object>>转换为Stream流,开启流式操作。map(map -> (List<String>) map.get("level")):对每个Map对象,提取key为"level"对应的List<String>元素(因Map值类型为Object,需强制类型转换)。flatMap(List::stream):调用flatMap将每个List<String>转换为Stream<String>,并把所有子流合并成一个单一的Stream<String>,完成扁平化操作。collect(Collectors.toList()):将扁平化后的Stream<String>收集为最终的List<String>。
健壮性优化
如果Map中可能存在key为"level"但值不是List<String>,或值为null的情况,建议添加校验避免异常:
List<String> flatValues = list.stream() .map(map -> map.get("level")) .filter(obj -> obj instanceof List<?>) .map(obj -> (List<String>) obj) .filter(listObj -> !listObj.isEmpty()) .flatMap(List::stream) .collect(Collectors.toList());
内容的提问来源于stack exchange,提问作者Nishant Kumar
相关产品推荐
相关产品推荐

