遍历列表中的另一个对象内的对象列表

时间:2019-10-28 18:27:39

标签: java java-8 java-stream

所以我有这样的结构

List<Object1> list1

class Object1{
   private List<Object2> list2
}
class Object2{
   private List<Object3> list3
} 

我需要获取所有Objects3实例的计数。 我是java-8和流技术的新手,所以这对我来说很混乱,但是我试图这样做。

Integer count =
                list1
                .parallelStream()
                .reduce(0,(sum, q) -> q.getList2()
                        .forEach()
                        .reduce(0,(sum2, q2) -> sum2 + q2.getList3().size()));

我还靠近吗?

2 个答案:

答案 0 :(得分:2)

鉴于您是流API的新手,所以我不怪您,但是您的方法过于复杂。

为了简化和可读性,我个人会采用这种方法。

list1.stream() // Stream<Object1>
     .flatMap(s -> s.getList2().stream()) // Stream<Object2>
     .flatMap(s -> s.getList3().stream()) // Stream<Object3>
     .count(); // return the count of all Object3 instances

答案 1 :(得分:0)

由于您需要每个list3实例中Object2的大小的 ,因此可以将flatMapToInt与嵌套的mapToInt一起使用将sum计算为:

int count = list1
        .stream()
        .flatMapToInt(obj1 -> obj1.getList2()
                .stream()
                .mapToInt(obj2 -> obj2.getList3().size()))
        .sum();