如果我必须使用 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);
}
无论如何,是否可以使用流以声明方式完成相同的操作,而无需迭代两次?