我具有以下结构:
class Object1 {
String id;
Integer total;
}
class Object2 {
String id;
List<Object3> list;
}
class Object3 {
Integer total;
}
当Object1
和Object2
具有相同的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不太熟悉。有人可以帮助我吗?
答案 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
中的其余元素。流中类似的性能增强将需要对以上示例进行重大更改。