Java Stream中如何将Map的值(集合)收集为单个集合?
合并Map中所有Set集合的最简实现方式
给定结构:
Map<Integer, Set<Integer>> structureIdWithUserIds
要把这个Map里所有值对应的Set<Integer>合并成一个统一的Set<Integer>,Java 8及以上版本里最简洁的实现是用Stream API:
Set<Integer> mergedUserIds = structureIdWithUserIds.values().stream() .flatMap(Set::stream) .collect(Collectors.toSet());
代码说明
structureIdWithUserIds.values():获取Map中所有的Set<Integer>集合stream():将集合转为Stream流flatMap(Set::stream):把每个Set的元素平铺成单个元素的流(相当于把多个小流合并成一个大流)collect(Collectors.toSet()):将流中的所有元素收集成一个新的Set集合
如果需要保留元素的插入顺序,可以把收集器换成Collectors.toCollection(LinkedHashSet::new):
Set<Integer> mergedUserIds = structureIdWithUserIds.values().stream() .flatMap(Set::stream) .collect(Collectors.toCollection(LinkedHashSet::new));
要是用Java 8之前的版本,只能用循环遍历的方式,代码会繁琐一些:
Set<Integer> mergedUserIds = new HashSet<>(); for (Set<Integer> userIdSet : structureIdWithUserIds.values()) { mergedUserIds.addAll(userIdSet); }
内容的提问来源于stack exchange,提问作者Sam Fisher
相关产品推荐
相关产品推荐

