gpt4 book ai didi

Java 8 Stream 从对象映射创建对象

转载 作者:行者123 更新时间:2023-11-30 06:03:24 25 4
gpt4 key购买 nike

我刚刚开始通过 Java 8 流 API 学习和实现集合。我有一节课:

public class Discount {
int amount;
String lastMarketingRegion;

Discount (int amount, String lastMarketingRegion) {
this.amount = amount;
this.lastMarketingRegion= lastMarketingRegion;
}

public int getAmount() { return amount; }

public String getLastMarketingRegion() { return lastMarketingRegion; }

public String toString() {
return String.format("{%s,\"%s\"}", amount, lastMarketingRegion);
}
}

我得到以下信息:

Map<String, Discount> prepaid = new HashMap<String, Discount>();
prepaid.put("HAPPY50", new Discount(100, "M1"));
prepaid.put("LUCKY10", new Discount(10, "M2"));
prepaid.put("FIRSTPAY", new Discount(20, "M3"));

Map<String, Discount> otherBills = new HashMap<String, Discount>();
otherBills.put("HAPPY50", new Discount(60, "M4"));
otherBills.put("LUCKY10", new Discount(7, "M5"));
otherBills.put("GOOD", new Discount(20, "M6"));

List<Map<String, Discount>> discList = new ArrayList<Map<String, Discount>>();
discList.add(prepaid);
discList.add(otherBills);

所以,基本上我有一个包含不同付款类型的所有折扣代码的 Discount map 列表。

要求是使用 sum_of_amountlast_region 创建一个包含所有付款类型的所有折扣代码的 map :

Map<String, Discount> totalDiscounts = 
{LUCKY10={17, "M5"}, FIRSTPAY={20, "M3"}, HAPPY50={160, "M4"}, GOOD={20, "M6"}}

我能够得到:

Map<String, Integer> totalDiscounts = 
{LUCKY10=17, FIRSTPAY=20, HAPPY50=160, GOOD=20}

使用以下代码:

 Map<String, Integer> afterFormatting = discList.stream()
.flatMap(m -> m.entrySet().stream())
.collect(Collectors.groupingBy(Map.Entry::getKey, Collectors.summingInt(map -> map.getValue().amount)));

但我还需要一个包含该区域的 Discount 对象。

我需要一个 Discount 对象的集合,其中金额是来自其他账单的相同键和区域的金额总和。

任何帮助将不胜感激。谢谢。

编辑 1 -为了简单起见,请考虑将lastMarketingRegion 与折扣代码具有相同的值。我也尝试通过图表来解释它 - enter image description here

最佳答案

来自评论

Why do you expect "LUCKY10" - "M5" when you have "M2" and "M5" entries for LUCKY10?

because otherBills has more priority than prepaid

您可以使用Collectors.toMap来实现此目的。它的最后一个参数是 mergeFunction,它合并 map 中具有相同 String 键的两个 Discounts。

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 Discount 将是来自 otherBills 映射的流,因此我'我正在选择它的区域。

如果您通过添加 otherBills 后跟 prepaid 来构建列表,那么这将有不同的输出。

依赖遭遇顺序使得这不是一个很好的解决方案。(如果您假设我们在处理第一个映射后处理第二个映射中的条目,为什么首先要合并它们?)

查看我的other answer使用Map.merge

关于Java 8 Stream 从对象映射创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52126290/

25 4 0