1 回答
TA贡献1799条经验 获得超9个赞
我需要根据程序集代码从程序集对象列表中删除程序集类的重复对象,但在删除之前,我需要将程序集数量添加到匹配的程序集对象的数量中。
您需要保留重复值才能重用它们。
removeIf()不会捕获此信息。
您可以使用迭代器删除元素并引入 Map 变量来存储重复信息:
Map<String, Double> assemblyDupMap = new HashMap<>();
for (Iterator<Assembly> it = assemblies.iterator(); it.hasNext(); ){
Assembly a = it.next();
if(!assmCode.add(a.getAssemblyCode())){
// store the duplicate information
double currentQty = assemblyDupMap.getOrDefault(a.getAssemblyCode(), 0D);
assemblyDupMap.put(a.getAssemblyCode(), currentQty + a.getAssemblyQty());
// remove it from the list
it.remove();
}
};
然后更新数量:
assemblies.forEach( a -> Optional.ofNullable(assemblyDupMap.get(a.getAssemblyCode()))
.ifPresent(qty -> a.incrementQty(qty))
);
正如您所注意到的,它已经足够冗长了。本质上是因为我们需要更新列表的元素。
如果创建新列表而不是使用现有列表是可以接受的,那么流方法会更简洁。
按 Map 中的汇编代码对对象进行分组,按代码求和它们的数量,并仅保留对象作为结果:
new ArrayList<>(assemblies.stream()
.collect(toMap(Assembly::getAssemblyCode, o -> o,
(a, b) -> new Assembly(a.getAssemblyCode(),
a.getAssemblyQty() + b
.getAssemblyQty()),
LinkedHashMap::new)
)
.values());
根据记录,对doubles 求和可能会产生“不良”结果。BigDecimal您可能感兴趣。
添加回答
举报