Hasmap合并函数在一个对象内的值

14 浏览
0 Comments

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

所以,现在我正在遍历销售对象的列表,并且对于每个销售对象,检查哈希映射是否存在该产品的条目,如果不存在,则创建一个,如果存在,则将当前销售中销售的产品数量添加到其中。

HashMap productSaleHash = 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;
    } 
HashMap productSaleHash = new HashMap<>();
    saleList.forEach(sale -> {
        productSaleHash.merge(sale.getProductId(), sale.getAmountSold(), "将旧的amountSold与销售数量相加");
    });

0
0 Comments

Hasmap merge function value inside an object出现的原因是需要通过遍历saleList来更新产品销售数量,但是在更新数量时,创建了一个新的对象,而不是直接更新对象内的变量。这违反了面向对象编程的核心原则。为了解决这个问题,需要找到一种方法来访问对象,并直接更新对象内的变量。

解决方法是使用Lambda表达式来替代方法引用,并在merge方法内修改创建的对象。具体代码如下:

(oldCount, newCount) -> { newCount.amountSold += oldCount.amountSold; return newCount; }

这样就可以直接通过访问对象内的变量来更新数量,而不需要创建新的对象。

0