使用 Collectors.groupingby 创建一个映射到集合的 Map。

12
我知道如何创建一个Map<T, List<U>>,使用Collectors.groupingByMap<Key, List<Item>> listMap = items.stream().collect(Collectors.groupingBy(s->s.key)); 我该如何修改这段代码以创建Map<Key, Set<Item>>?或者我不能使用stream来完成它,必须手动创建一个for循环等来完成吗?
3个回答

17

groupingBy 中,将 Collectors.toSet() 作为下游操作:

Map<Key, Set<Item>> map = items.stream()
            .collect(Collectors.groupingBy(s -> s.key, Collectors.toSet()));

4

你必须使用类似于这样的下游收集器:

Map<Key, Set<Item>> listMap = items.stream()
    .collect(Collectors.groupingBy(s -> s.key, Collectors.toSet()));

3

有时候我也喜欢非流式解决方案:

 Map<Key, Set<Item>> yourMap = new HashMap<>();
 items.forEach(x -> yourMap.computeIfAbsent(x.getKey(), ignoreMe -> new HashSet<>()).add(x));

如果你愿意,你也可以通过compute/merge方法来实现相同的效果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接