gpt4 book ai didi

java - 使用流 api 对对象列表中的多个不同字段求和?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:01:08 26 4
gpt4 key购买 nike

在 Java 8 中,如果我有这样一个对象列表:

 MyObject
double a;
double b;
double c;

我想获取对象列表中每个字段的总计。我可以做到的一种方法如下:

double totalA = myListOfObjects.stream().map(e -> e.getA()).reduce(0.0, (x, y) -> x + y);
double totalB = myListOfObjects.stream().map(e -> e.getB()).reduce(0.0, (x, y) -> x + y);
double totalC = myListOfObjects.stream().map(e -> e.getC()).reduce(0.0, (x, y) -> x + y);

但是是否可以使用流 api 将其组合成一次遍历对象列表?如果我只是编写一个 for/while 循环(见下文)并手动将 3 个总数相加,那似乎比上面的 3 行代码更有效)

for (MyObject obj: myListOfObjects) {
totalA += obj.getA();
totalB += obj.getB();
totalC += obj.getC();
}

谢谢

最佳答案

您可以像这样缩减为新的 MyObject 对象:

MyObject totals = myListOfObjects.stream()
.reduce((x, y) -> new MyObject(
x.getA() + y.getA(),
x.getB() + y.getB(),
x.getC() + y.getC()
))
.orElse(new MyObject(0, 0, 0));

totalA = totals.getA();
totalB = totals.getB();
totalC = totals.getC();

无论如何,我认为您不必担心此处的性能。所有三个解决方案(您的问题中的 2 个 + 我的上面的问题)都具有 O(n) 时间复杂度。我建议阅读一些有关过早优化的文章。只需选择最具可读性和最容易理解的代码。

您还可以提取代码将两个对象相加到 MyObject 类中的一个方法中:

public class MyObject {

// fields, constructors, getters etc.

public MyObject sum(MyObject other) {
return new MyObject(
this.a + other.a,
this.b + other.b,
this.c + other.c
);
}
}

这将允许您使用方法引用:.reduce(MyObject::sum)

关于java - 使用流 api 对对象列表中的多个不同字段求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40039318/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com