Java 如何有效地将多个对象中相同属性的值相加到一个新对象中
How to efficiently sum values of the same properties from multiple objects into a new object in Java
假设我有一个 Class 目标。
public class Obj {
private double prop1;
private double prop2;
private double prop3;
private double prop4;
// assume getters, setters and constructors are created
}
还有一个包含多个实例的列表(在这个例子中只有两个)。
List<Obj> objList = List.of(new Obj(12.9, 3.4, 38.6, 0.3), new Obj(0.123, 95.4, 23.0, 7.56));
要使一个对象具有列表中所有实例的相同属性值的总和,最有效的方法是什么?
Obj{13.023, 98.8, 61.6, 7.86}
我们可以使用 java 8 reduce 来相当简单地完成这个。
List<Obj> objList = List.of(new Obj(12.9, 3.4, 38.6, 0.3), new Obj(0.123, 95.4, 23.0, 7.56));
Obj total = objList.stream().reduce(new Obj(), (subtotal, element) -> {
subtotal.setProp1(subtotal.getProp1() + element.getProp1());
subtotal.setProp2(subtotal.getProp2() + element.getProp2());
subtotal.setProp3(subtotal.getProp3() + element.getProp3());
subtotal.setProp4(subtotal.getProp4() + element.getProp4());
return subtotal;
});
这利用传递 reduce 一个新对象,该对象的所有双打初始值为 0,然后我们使用累加器更新该值,将其减少到 1 个值。
我会创建一个 no-arg 构造函数和一个 merge() 方法
public Obj merge(Obj o) {
if (o != null) {
this.prop1 += o.prop1;
//etc etc
}
return this;
}
然后求和:
Obj sum = new Obj();
for (Obj o : list) {
sum.merge(o);
}
假设我有一个 Class 目标。
public class Obj {
private double prop1;
private double prop2;
private double prop3;
private double prop4;
// assume getters, setters and constructors are created
}
还有一个包含多个实例的列表(在这个例子中只有两个)。
List<Obj> objList = List.of(new Obj(12.9, 3.4, 38.6, 0.3), new Obj(0.123, 95.4, 23.0, 7.56));
要使一个对象具有列表中所有实例的相同属性值的总和,最有效的方法是什么?
Obj{13.023, 98.8, 61.6, 7.86}
我们可以使用 java 8 reduce 来相当简单地完成这个。
List<Obj> objList = List.of(new Obj(12.9, 3.4, 38.6, 0.3), new Obj(0.123, 95.4, 23.0, 7.56));
Obj total = objList.stream().reduce(new Obj(), (subtotal, element) -> {
subtotal.setProp1(subtotal.getProp1() + element.getProp1());
subtotal.setProp2(subtotal.getProp2() + element.getProp2());
subtotal.setProp3(subtotal.getProp3() + element.getProp3());
subtotal.setProp4(subtotal.getProp4() + element.getProp4());
return subtotal;
});
这利用传递 reduce 一个新对象,该对象的所有双打初始值为 0,然后我们使用累加器更新该值,将其减少到 1 个值。
我会创建一个 no-arg 构造函数和一个 merge() 方法
public Obj merge(Obj o) {
if (o != null) {
this.prop1 += o.prop1;
//etc etc
}
return this;
}
然后求和:
Obj sum = new Obj();
for (Obj o : list) {
sum.merge(o);
}