Java Lambda 单个流上的多个操作

标签 java lambda

场景:我有一个具有 2 个函数的对象 -->

<Integer> getA(); <Integer> getB();

我有一个对象列表,比如说 List<MyObject> myObject .

目标 遍历列表并获取对象列表中 A 和 B 的总和。

我的解决方案

myObject.stream().map(a -> a.getA()).collect(Collectors.summingDouble());

myObject.stream().map(a -> a.getB()).collect(Collectors.summingDouble());

问题:我怎样才能同时进行这两项操作?这样我就不必在原始列表上迭代两次。

@Edit:我这样做是因为我使用的一些过滤器是 O(n^3)。做两次真的很糟糕。

Benchmark:程序在i5上运行半小时,是T还是2T真的很重要。这是基于更少的数据,如果我在集群上运行,我的数据也会更大。

如果您可以在一行中完成这些,那确实很重要!

最佳答案

您需要编写另一个类来存储总值,如下所示:

public class Total {
    private int totalA = 0;
    private int totalB = 0;

    public void addA(int a) {
        totalA += a;
    }

    public void addB(int b) {
        totalB += b;
    }

    public int getTotalA() {
        return totalA;
    }

    public int getTotalB() {
        return totalB;
    }
}

然后使用

收集值
Total total = objects.stream()
        .map(o -> (A) o)
        .collect(Total::new,
                (t, a) -> {
                    t.addA(a.getA());
                    t.addB(a.getB());
                },
                (t1, t2) -> { });
//check total.getTotalA() and total.getTotalB()

您还可以使用 AbstractMap.SimpleEntry<Integer, Integer>替换 Total避免编写新类,但这仍然有点奇怪,因为 A/B 不是键值关系。

关于Java Lambda 单个流上的多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38949719/

相关文章:

c# - 将对象列表添加到实体数据库

Java:查找最新报告并输出到屏幕

java - Vaadin 8 - 应用程序范围的缓存

c# - 如何比较两个波斯枣以找出哪个更大?

java - 如何使用 lambda 初始化字段

lambda - 传递和评估防 rust 封闭

java - 如何访问 BigQuery 结果集的 cacheHit 属性?

java - 将参数从父级传递给 public void run()

java - 更改选项卡式 Pane 中当前面板的标签

java - 更改方法引用类型