我有以下结构:
class Object1 {
String id;
Integer total;
}
class Object2 {
String id;
List<Object3> list;
}
class Object3 {
Integer total;
}
当 Object1
和 Object2
具有相同的 id
我需要通过总结更新 Object1 的 total
object2
内 list
中所有 Object3
的 total
并从 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/