首页 > 解决方案 > java - 如何计算Java 8中嵌套类结构中属性的总和?

问题描述

我有3个类,A类,B类,C类。A类包含B类列表,B类包含C类列表。C类包含原语。

class A {
    List<B> bList;
//getter
}

class B {
    List<C> cList;
//getter
}

class C {
    int a;
    int b;
    int c;
//getter
}

我想做以下事情。

A aInstance = new A();
List<B>bs = aInstance.getBList();
for(B b: bs) {
        List<C> cs = b.getCList();
        for(C c: cs) {
            sum_a += c.a;
            sum_b_c += c.b + c.c;
        }
    }

如何使用 java 8 特定流实现这一点?

标签: javajava-8java-stream

解决方案


例如,您可以reduce将其设置为具有两个元素的 int 数组:

int[] result = aInstance
            .getBList()
            .stream()
            .flatMap(b -> b.getcList().stream())
            .map(c -> new int[] { c.a, c.b + c.c })
            .reduce((left, right) -> {
                int[] newV = new int[2];
                newV[0] = left[0] + right[0];
                newV[1] = left[1] + right[1];
                return newV;
            })
            .orElse(new int[] { 0, 0 });

或者甚至更好collect(不要创建很多int []对象):

int[] result = aInstance
            .getBList()
            .stream()
            .flatMap(b -> b.getCList().stream())
            .collect(
                    () -> new int[2],
                    (arr, c) -> {
                        arr[0] += c.a;
                        arr[1] += c.b + c.c;
                    }, 
                    (left, right) -> {
                        left[0] += left[0];
                        right[1] += right[1];
                    });

推荐阅读