如何将Map<String, List<MyObject>>的所有值列表合并为单个List<MyObject>
合并Map值集合的实现方案
方案1:Java 8及以上版本(Stream 写法最简洁)
利用flatMap展开嵌套的List集合,一行即可完成合并:
// 返回不可变List(Java 16+ 支持toList()直接调用,低版本可替换为collect(Collectors.toList())) List<MyObject> mergedList = myMap.values().stream() .flatMap(List::stream) .toList(); // 如需返回可修改的ArrayList实例,用以下写法 List<MyObject> mergedList = myMap.values().stream() .flatMap(List::stream) .collect(Collectors.toCollection(ArrayList::new));
方案2:低版本Java兼容写法
不依赖Stream特性,性能和Stream写法一致:
List<MyObject> mergedList = new ArrayList<>(); for (List<MyObject> subList : myMap.values()) { mergedList.addAll(subList); }
原写法错误原因
你之前的写法失效是因为:myMap.values()返回的是Collection<List<MyObject>>类型,直接传入ArrayList构造方法只会把每个子List作为单个元素存入新列表,不会自动展开子List内部的MyObject元素。
性能优化提示
如果对内存占用要求较高,可以提前计算所有子元素总长度,初始化ArrayList时指定容量,避免自动扩容带来的额外开销:
int totalSize = myMap.values().stream().mapToInt(List::size).sum(); List<MyObject> mergedList = new ArrayList<>(totalSize); // 后续执行addAll或collect操作即可
内容的提问来源于stack exchange,提问作者navig8tr
相关产品推荐
相关产品推荐

