首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java 8中遍历2个对象和1个嵌套对象

在Java 8中遍历2个对象和1个嵌套对象
EN

Stack Overflow用户
提问于 2019-07-19 21:20:49
回答 1查看 97关注 0票数 1

我有以下结构:

代码语言:javascript
复制
class Object1 {
   String id;
   Integer total;
}
代码语言:javascript
复制
class Object2 {
   String id;
   List<Object3> list;
}
代码语言:javascript
复制
class Object3 {
   Integer total;
}

Object1Object2具有相同的id时,我需要从total中更新Object1,方法是将total中的所有Object3相加,然后从list中减去< Object2 >d12Object1 >。

它在没有Java 8的情况下是这样工作的:

代码语言:javascript
复制
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的方法:

代码语言:javascript
复制
list1.forEach(object1 -> list2.stream()
     .filter(object2 ->object2.getId().equals(object1.getId()))

但我不知道如何处理逻辑,因为我对Java 8不是很熟悉。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-19 21:30:03

尝尝这个。解释以注释形式内联

代码语言:javascript
复制
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。在这种情况下,您应该在object1.setTotal之后添加一条break语句。这将避免对list2中的其余元素进行不必要的迭代。在流中进行类似的性能增强需要对上面的示例进行重大更改。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57113383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档