【发布时间】:2020-01-07 02:27:58
【问题描述】:
如果我必须使用 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);
}
有没有办法使用流以声明方式完成相同的工作,而不需要迭代两次?
【问题讨论】:
-
在Java 12中,你可以使用the
teeingcollector,但是,我不认为“迭代两次”对于普通集合来说是一个实际的问题。这听起来更像是过早的优化。事实上,考虑到 JIT 和 Hotspot 优化器的工作方式,解决方案迭代两次但在内部循环中执行一次操作可能会更快。
标签: java java-8 functional-programming java-stream vavr