如果我必须使用 Stream 基于两个不同的字段生成两个组,这是我可以采用的一种方法:
var prop1Group = beans.stream().collect(Collectors.groupingBy(Bean::getProp1));
var prop2Group = beans.stream().collect(Collectors.groupingBy(Bean::getProp2));
但是这种方法会遍历列表两次。 以命令式的方式,我可以在单次迭代中得到相同的结果,如下所示:
var prop1Group = new HashMap<String, Set<Bean>>();
var prop2Group = new HashMap<String, Set<Bean>>();
for (var bean : beans) {
prop1Group.computeIfAbsent(bean.getProp1(), key -> new HashSet<>()).add(bean);
prop2Group.computeIfAbsent(bean.getProp2(), key -> new HashSet<>()).add(bean);
}
有没有办法在不迭代两次的情况下使用流以声明的方式完成同样的事情?
最佳答案
根据@Holger 的评论,我可以像这样用 teeing 更明确地编写它,但这仍然需要 2N
beans.stream().collect(
Collectors.teeing(
groupingBy(Bean::getProp1),
groupingBy(Bean::getProp2),
List::of))
关于Java groupingBy : Get two (or more) groups with single Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57784249/