2 回答
TA贡献1843条经验 获得超7个赞
来自评论
当您有 LUCKY10 的“M2”和“M5”条目时,为什么您期望“LUCKY10”-“M5”?
因为 otherBills 比预付更优先
您可以Collectors.toMap为此使用。它的最后一个参数是mergeFunction合并地图中具有相同字符串键的两个折扣。
Map<String, Discount> totalDiscounts = discList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
(discount1, discount2) -> new Discount(discount1.getAmount() + discount2.getAmount(),
discount2.getLastMarketingRegion())));
由于从列表中生成的流是有序的,discount2 折扣将是otherBills地图中的那个,因此我选择了它的区域。
如果您通过添加otherBills后跟来构建列表prepaid,那么这将有不同的输出。
依靠遭遇顺序使这不是一个很好的解决方案。(如果您假设我们在处理第一个地图后处理第二个地图中的条目,为什么首先合并它们?)
TA贡献1982条经验 获得超2个赞
如果您只有两张地图,那么与其使用基于流的解决方案,您可以使用Map.merge
它。
在这里,我们制作prepaid
地图的副本。然后我们遍历otherBills
地图。对于每个键
如果映射不存在,则将其添加到映射(结果映射)中
如果映射已经存在,我们构造一个新
Discount
对象,其数量是映射中已经存在的 Discount 对象(来自 的prepaid
那个)和当前的 Discount 对象(来自 的那个)的总和otherBill
。它从otherBill
地图中获取 Discount 对象的区域。
Map<String, Discount> result = new HashMap<>(prepaid);
otherBills.forEach((k, v) -> result.merge(k, v, (discountFromPrepaid, discountFromOtherBill) ->
new Discount(discountFromPrepaid.getAmount() + discountFromOtherBill.getAmount(),
discountFromOtherBill.getLastMarketingRegion())));
添加回答
举报