在同一对象中求和值

时间:2017-11-10 10:21:45

标签: java java-8 java-stream flatmap

我有一个具有许多属性的对象

我想在一个名为sumOfValues;

的属性中对所有50个值求和

而且,valueX可以为null,这就是我使用Double

的原因

使用java 8。

public class MyObject {

    private String id;
    private String name;

    private Double value1;
    private Double value2;
    ....
    private Double value50;

    private Double sumOfValues;

}

编辑:

所有值都必须存储在数据库中,因此我无法创建列表

3 个答案:

答案 0 :(得分:3)

这不是一个好主意,也不适合使用流,但是,您可以定义一个数组或列表来存储所有Double值,在这种情况下,您可以执行所有值的总和。即

使用数组时:

double sum1 = Arrays.stream(array).filter(Objects::nonNull).mapToDouble(x -> x).sum();

使用列表时:

double sum1 = myList.stream().filter(Objects::nonNull).mapToDouble(e -> e).sum();

答案 1 :(得分:1)

您可以使用java反射来解决此问题。

我正在考虑你的班级有所有领域的吸气剂和制定者;

因此valueX的getter将为getValueX()

myObject.setSumOfValues(
    Arrays.stream(myObject.getClass().getMethods())
          .filter(method -> method.getName().contains("getValue"))
          .mapToDouble(method -> {
              try {
                  Double result = (Double) method.invoke(myObject);
                  return result != null ? result : 0;
              } catch (IllegalAccessException | InvocationTargetException ignored) {
                  return 0;
              }
          })
          .sum()
);

答案 2 :(得分:-1)

这个问题的答案取决于你将如何使用这个课程。 一种方法是创建一个私有的updateTotalsum()函数,并从该类的每个函数调用此函数,以便在每次总和更新时调用任何函数。 例如: 输出:

public class MyClass {
private int x;
private int y;
private int sum;
MyClass(){
    this.sum = this.x + this.y;
}
public void set_x(int a){
    this.x=a;
    this.updateSum();
}
public void set_y(int b){
    this.y=b;
    this.updateSum();
}
private void updateSum(){
    this.sum = this.x + this.y;
}
public int getSum(){
    return this.sum;
}
public static void main(String args[]) {
    MyClass obj = new MyClass();
    System.out.println("Sum of x+y = " + obj.getSum());
    obj.set_x(23);
    System.out.println("Sum of x+y = " + obj.getSum());
    obj.set_y(56);
    System.out.println("Sum of x+y = " + obj.getSum());
}

}

x + y的总和= 0

x + y = 23的总和

x + y之和= 79

您可以使用数组作为值,而不是将它们命名为value1,value2 .... 并且可以通过使用for循环来计算数组的总和。