场景:我有一个具有 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/