汇总列表中的所有属性值

时间:2019-09-17 19:07:23

标签: java list arraylist

我有一个带有多个Integer属性的类,就像这样:

public class Test {
    private Integer a;
    private Integer b;
    private Integer c;
    private Integer d;
    private Integer e;
    private Integer f;
    private Integer g;
}

因此,我得到了具有很多寄存器的此类的列表,并且我必须单独汇总该列表的所有属性。然后我做了类似的事情:

List<Test> tests = testRepository.findAllTest();

Test test = new Test();
for (Test testList: tests) {
    test.setA(test.getA + testList.getA);
    test.setB(test.getB + testList.getB);
    test.setC(test.getC + testList.getC);
    test.setD(test.getD + testList.getD);
    test.setE(test.getE + testList.getE);
    test.setF(test.getF + testList.getF);
    test.setG(test.getG + testList.getG);
}
 return test;

此实现工作正常,但我现在想知道是否有更简单的方法来执行此操作,清理代码并使之简单

4 个答案:

答案 0 :(得分:2)

我将其分解为两个子问题:将一个Test对象添加到另一个,然后汇总列表。

对于第一个问题,您可以在Test类中添加一个方法,该方法添加两个测试对象并返回一个包含总和的新Test对象。

public class Test {
    ...

    public Test add(Test testToAdd){
        Test result = new Test();
        result.setA(a + testToAdd.getA());
        ...
        result.setG(g + testToAdd.getG());
        return result;
    }
}

然后您可以在求和循环中调用它:

List<Test> tests = testRepository.findAllTest();
Test testTotal = new Test();
for (Test test: tests) {
    testTotal = testTotal.add(test);
}

另一个好处是可以更清楚地了解循环的作用。

答案 1 :(得分:2)

您可以修改您的Test类以包括添加方法:

public class Test {
    private int a;
    private int b;
    private int c;
    //...

    public void add(Test o) {
        this.a += o.getA();
        this.b += o.getB();
        this.c += o.getC();
        //...
    }
    // setters and getters...
}

然后您的求和函数应如下所示:

public Test summation(Collection<Test> testCollection) {
    Test sum = new Test();
    for(Test test : testCollection) {
        sum.add(test);
    }
    return sum;
}

答案 2 :(得分:2)

使用Stream.reduce向已经存在的答案添加另一种类似的方法:

如果没有,请向测试类中添加一个无参数的构造函数:

private Test() {
    this(0,0,0,0,0,0,0);
}

在测试类中添加方法addAttributes

public Test addAttributes(Test other){
    this.a += other.a; 
    this.b += other.b; 
    this.c += other.c; 
    this.d += other.d;
    //.... 
    return this;
}

然后您可以通过执行以下操作来减少列表:

Test result = tests.stream().reduce(new Test(), (t1,t2) -> t1.addAttributes(t2));

答案 3 :(得分:1)

在您的add(Test other)类中编写一个Test方法:

public void add(Test other) {
   this.a += other.getA();
   this.b += other.getB();
   // ...
   this.g += other.getG();
}

然后使用它:

Test test = new Test();
List<Test> allTests = testRepository.findAllTest();
allTests.forEach(individualTest -> individualTest.add(test));
return test;
相关问题