Hasmap合并函数在一个对象内的值
Hasmap合并函数在一个对象内的值
我正在尝试从销售列表中获取产品的数量统计。我有以下内容:
public class sale { public String productId; . .//其他销售变量 . public int amountSold; }
我目前的做法是基于这个整数的答案:
how to merge more than one hashmaps also sum the values of same key in java
所以,现在我正在遍历销售对象的列表,并且对于每个销售对象,检查哈希映射是否存在该产品的条目,如果不存在,则创建一个,如果存在,则将当前销售中销售的产品数量添加到其中。
HashMapproductSaleHash = new HashMap<>(); saleList.forEach(sale -> { productSaleHash.merge(sale.getProductId(), sale.getAmountSold(), Integer::sum); });
这样做是有效的,但是然后我必须将哈希映射转换为ArrayList,并将销售详细信息添加到每个条目中,因为我还希望发送其他销售变量,例如productName,而不仅仅是id和销售数量。因此,我正在尝试找到更高效的方法来实现这一点。
这是我正在尝试的做法,我创建了一个名为productCount的新DTO对象,并且不是存储整数,而是将对象存储在哈希映射中。
public class productCount { public String productId; public String productName; public int amountSold; } HashMapproductSaleHash = new HashMap<>(); saleList.forEach(sale -> { productSaleHash.merge(sale.getProductId(), sale.getAmountSold(), "将旧的amountSold与销售数量相加"); });
Hasmap merge function value inside an object出现的原因是需要通过遍历saleList来更新产品销售数量,但是在更新数量时,创建了一个新的对象,而不是直接更新对象内的变量。这违反了面向对象编程的核心原则。为了解决这个问题,需要找到一种方法来访问对象,并直接更新对象内的变量。
解决方法是使用Lambda表达式来替代方法引用,并在merge方法内修改创建的对象。具体代码如下:
(oldCount, newCount) -> { newCount.amountSold += oldCount.amountSold; return newCount; }
这样就可以直接通过访问对象内的变量来更新数量,而不需要创建新的对象。