1 回答

TA貢獻1799條經驗 獲得超9個贊
我需要根據(jù)程序集代碼從程序集對象列表中刪除程序集類的重復對象,但在刪除之前,我需要將程序集數(shù)量添加到匹配的程序集對象的數(shù)量中。
您需要保留重復值才能重用它們。
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();
}
};
然后更新數(shù)量:
assemblies.forEach( a -> Optional.ofNullable(assemblyDupMap.get(a.getAssemblyCode()))
.ifPresent(qty -> a.incrementQty(qty))
);
正如您所注意到的,它已經足夠冗長了。本質上是因為我們需要更新列表的元素。
如果創(chuàng)建新列表而不是使用現(xiàn)有列表是可以接受的,那么流方法會更簡潔。
按 Map 中的匯編代碼對對象進行分組,按代碼求和它們的數(shù)量,并僅保留對象作為結果:
new ArrayList<>(assemblies.stream()
.collect(toMap(Assembly::getAssemblyCode, o -> o,
(a, b) -> new Assembly(a.getAssemblyCode(),
a.getAssemblyQty() + b
.getAssemblyQty()),
LinkedHashMap::new)
)
.values());
根據(jù)記錄,對doubles 求和可能會產生“不良”結果。BigDecimal您可能感興趣。
添加回答
舉報