我有一个具有许多属性的对象
我想在一个名为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;
}
编辑:
所有值都必须存储在数据库中,因此我无法创建列表
答案 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循环来计算数组的总和。