我有以下结构:
class Object1 {
String id;
Integer total;
}class Object2 {
String id;
List<Object3> list;
}class Object3 {
Integer total;
}当Object1和Object2具有相同的id时,我需要从total中更新Object1,方法是将total中的所有Object3相加,然后从list中减去< Object2 >d12Object1 >。
它在没有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不是很熟悉。
发布于 2019-07-19 21:30:03
尝尝这个。解释以注释形式内联
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中的其余元素进行不必要的迭代。在流中进行类似的性能增强需要对上面的示例进行重大更改。
https://stackoverflow.com/questions/57113383
复制相似问题