Java groupingBy : Get two (or more) groups with single Stream

标签 java java-8 functional-programming java-stream vavr

如果我必须使用 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/

相关文章:

java - 尝试在 Java 运行时从 Enum 获取关联值

java - Spring boot 2.0.5.RELEASE 应用程序未部署在 JBoss 6.4.0 中

java-8 - CompletableFuture 异常打破工作链

functional-programming - 为什么OCaml有两个排序函数: List. sort和List.stable_sort?

Scala 结合时间戳序列

java - 如何通过 ELB 将 HTTPS 流量路由到运行 Java JHipster webApp 的 EC2 容器

Linux (Ubuntu) 中的 Java 系统托盘应用程序从服务(守护程序)启动

java - 使用 Java 函数式编程简化 if-else 条件

java - 使用 Java8 流过滤 map 键后映射到列表

list - Scala 中具有两个值的匹配列表