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);
}