gpt4 book ai didi

java - 对对象流中的每个字段求和

转载 作者:行者123 更新时间:2023-12-01 12:43:52 24 4
gpt4 key购买 nike

我想创建对象 MyObject 的实例,其中的每个字段都是该字段值的总和

我创建一个对象

       public class MyObject{
int value;
double length;
float temperature;

MyObject(int value, double length, float temperature){
this.value = value;
this.length = length
this.temperature = temperature
}
}

然后我构造对象列表:
    List<MyObject> list = new ArrayList<MyObject>{{
add(new MyObject(1, 1d, 1.0f));
add(new MyObject(2, 2d, 2.0f));
add(new MyObject(3, 3d, 3.0f));
}}

我想创建对象( new MyObject(6, 6d, 6f) )

对每个流的一个字段求​​和很容易:
Integer totalValue = myObjects.parallelStream().mapToInt(myObject -> myObject.getValue()).sum(); //returns 6;

或者
Double totalLength = myObjects.parallelStream().mapToDouble(MyObject::getLength).sum(); //returns 6d

然后构造对象 new MyObject(totalValue, totalLength, totalTemperature);
但是我可以在一个流中汇总所有字段吗?
我想要流返回
new MyObject(6, 6d, 6.0f)

最佳答案

其他解决方案是有效的,但它们都会产生不必要的开销;一通过复制 MyObject多次,另一个通过多次流式传输集合。如 MyObject是可变的,理想的解决方案是 mutable reduction使用 collect() :

// This is used as both the accumulator and combiner,
// since MyObject is both the element type and result type
BiConsumer<MyObject, MyObject> reducer = (o1, o2) -> {
o1.setValue(o1.getValue() + o2.getValue());
o1.setLength(o1.getLength() + o2.getLength());
o1.setTemperature(o1.getTemperature() + o2.getTemperature());
}
MyObject totals = list.stream()
.collect(() -> new MyObject(0, 0d, 0f), reducer, reducer);

此解决方案仅创建一个额外的 MyObject实例,并且只迭代列表一次。

关于java - 对对象流中的每个字段求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39083824/

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