【发布时间】:2022-08-06 13:18:26
【问题描述】:
我有两个 Java 对象列表
假设 dataToBeAdded、dataToBeSubtracted
对象具有相同的数据类型并具有多个属性
虚拟对象{ attr1, attr2, 属性 3, attr4 }
我想合并这些列表,但以有条件的方式 如果 attr1、attr2、attr3 在列表中匹配
减去 attr4 并使其成为列表的一部分。
如果属性不匹配
-
元素来自 list1(dataToBeadded) 将其按原样添加到输出
-
元素来自 list2(dataToBeSubtracted) 使 attr4 为负数(乘以 -1)
这有点像完全外连接类型的操作
我使用 Maps 和 Streams 做了一些事情
Map<String, DummyObj> dataToBeAddedMap = dataToBeAdded.stream()
.collect(Collectors.toMap(obj -> obj.attr1() + obj.attr2() + obj.attr3(), item -> item));
Map<String, CumulativeSalesDataByHour> dataToBeSubtractedMap = dataToBeSubtracted.stream()
.collect(Collectors.toMap( obj -> obj.attr1() + obj.attr2() + obj.attr3(), item ->
new DummyObject(item.attr1(), item.attr2(), item.attr3(), -1 * item.attr4())));
Map<String, DummyObject> resultantData = Stream.of(dataToBeAddedMap, dataToBeSubtractedMap)
.flatMap(map -> map.entrySet().stream())
.collect(Collectors.toMap(
Map.Entry::getKey,
Map.Entry::getValue,
(v1, v2) -> new DummyObject(v1.attr1(),
v1.attr2(),
v1.attr3(),
v1.attr4() + v2.attr4())
));
System.out.println(resultantData.values());
这给了我想要的结果,但有没有更有效的方法来实现这一目标?
编辑1:
添加输入和预期输出
DummyObject a1 = new DummyObject(\"uuid1\", \"abcd\", \"mer1\", 20D);
DummyObject a2 = new DummyObject(\"uuid1\", \"pqrs\", \"mer1\", 25D);
DummyObject a3 = new DummyObject(\"uuid2\", \"xyz\", \"mer1\", 18D);
List<DummyObject> dataToBeAdded = ImmutableList.of(a1,a2,a3);
DummyObject d1 = new DummyObject(\"uuid1\", \"abcd\", \"mer1\", 5D);
DummyObject d2 = new DummyObject(\"uuid1\", \"pqrs\", \"mer1\", 2D);
DummyObject d3 = new DummyObject(\"uuid3\", \"xyz\", \"mer2\", 10D);
List<DummyObject> dataToBeSubtracted = ImmutableList.of(d1,d2,d3);
Desired Output
[
DummyObject(\"uuid1\", \"abcd\", \"mer1\", 15D); // 20-5
DummyObject(\"uuid1\", \"pqrs\", \"mer1\", 23D); // 25-2
DummyObject(\"uuid2\", \"xyz\", \"mer1\", 18D);
DummyObject(\"uuid3\", \"xyz\", \"mer1\", -10D);
]
标签: java list dictionary object java-stream