在Java 8中迭代2个对象和1个嵌套对象

时间:2019-07-19 13:20:49

标签: java java-8

我具有以下结构:

class Object1 {
   String id;
   Integer total;
}
class Object2 {
   String id;
   List<Object3> list;
}
class Object3 {
   Integer total;
}

Object1Object2具有相同的id时,我需要通过汇总所有{{1}中的total来更新Object1的total }}在Object3内的list中,并从Object2 Object1中减去。

没有total,它的工作原理如下:

java 8

这是我到目前为止使用for (Object1 object1 : list1) { for (Object2 object2 : list2) { if (object1.getId().equals(object2.getId())) { int total = 0; for (Object3 object3 : object2.getlist3()) { total += object3.getTotal(); } object1.setTotal(object1.getTotal() - total); } } } 的结果:

Java 8

但是我不知道如何处理逻辑,因为我对Java 8不太熟悉。有人可以帮助我吗?

1 个答案:

答案 0 :(得分:3)

尝试一下。内嵌解释为注释

list1.forEach(object1 -> 
    object1.setTotal(
        object1.getTotal() - list2.stream()
            .filter(object2 -> object1.getId().equals(object2.getId()))
            .flatMap(object2 -> object2.getList3().stream()) // Stream<Object2> to Stream<Object3>
            .mapToInt(Object3::getTotal)                     // get each total
            .sum()                                           // sum them
    )
);

值得注意的是,如果有多个ID匹配,您将多次调用object1.setTotal,从而有效地覆盖了先前的结果。您可能会说这很好,并且以这样一种方式填充列表,即只有一个匹配的ID。在这种情况下,您应该在break之后添加object1.setTotal语句。这将避免不必要地遍历list2中的其余元素。流中类似的性能增强将需要对以上示例进行重大更改。