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

标签 java java-8

我有以下结构:

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

Object1Object2 具有相同的 id 我需要通过总结更新 Object1 的 total object2list 中所有 Object3total 并从 Object1 中减去总计

它在没有 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 的结果:

list1.forEach(object1 -> list2.stream()
     .filter(object2 ->object2.getId().equals(object1.getId()))

但是我对Java 8不是很熟悉,不知道怎么继续逻辑。

最佳答案

试试这个。解释作为注释内联

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 中的剩余元素。流中类似的性能增强需要对上述示例进行重大更改。

关于java - 在 Java 8 中迭代 2 个对象和 1 个嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57113383/

相关文章:

java - Spring GWT http 请求超时

java - Saxon XSLT 和 NodeList 作为参数

java - ScheduledExecutorService 只调用一个线程

docker - 在 centos 7 dockerfile 中安装 java 8

java - 找不到类型为 : class org. json.JSONArray 的返回值的转换器

java - Stream、Map、Reduce……是怎么做到的?

java - 在 Java 8 Comparator 中添加 Optional.isPresent()

java - java 8 中新颖的加糖功能?

java无法从文件中读取一行

java - 将 SOP 控制台消息重定向到 JTextArea 并且也不应该闪烁并且应该与 java 控制台相同逐行打印