gpt4 book ai didi

Java 8 Query - 基于具有多个对象列表的键的分组计算

转载 作者:行者123 更新时间:2023-12-01 14:20:38 25 4
gpt4 key购买 nike

我需要一些 Java 8 解决方案的帮助来计算总数。
假设我有 3 个项目对象,每个对象都包含一个(2 或 3 个)税对象列表。请在下面找到该物体的详细图像 -
第 1 项
(列表)
税 1 - Id-1 |姓名-A |描述 |金额-Rs.5 |更多对象
税 2 - Id-2 |姓名-B |描述 |金额-Rs.10 |更多对象
税 3 - Id-3 |名称-C |描述 |金额-Rs.8 |更多对象

第 2 项
(列表)
税 1 - Id-1 |姓名-A |描述 |金额-Rs.9 |更多对象
税 3 - Id-3 |名称-C |描述 |金额-Rs.10 |更多对象
现在,
我创建了一个新的对象(聚合),它需要是基于 Id 的总数
例如:上述信息应该有 3 个汇总对象,金额相加
税-1 |姓名-A |描述 |金额-Rs.14
税-2 |姓名-B |描述 |金额-Rs.10
税-2 |姓名-B |描述 |金额-Rs.18

我能够通过循环遍历每个对象并将其添加到 map 来实现这一点。如果键存在,我会从对象聚合中提取数量值并将数量添加到现有数量。如果没有,我将创建一个新的 Aggregate 对象并将其添加到 map 中,但我希望在 Java 8 中是否有更优化的方法来执行此操作
全局变量 - Map<String, Aggregate> taxAggreg

for (Item item: Items) {
List < Tax > taxes = item.getTaxes;
for (Tax tax: taxes) {
createTax(Tax tax);
}
}

private void createTax(Tax tax) {
if (!taxAggreg.isEmpty() && taxAggreg.containsKey(tax.getTaxId())) {
Aggregate aggreg = taxAggreg.get(tax.getTaxId());
aggreg.setTaxAmount(aggreg.getTaxAmount().add(tax.getTaxAmount()));
taxAggreg.put(tax.getTaxId(), aggreg);
} else {
taxAggreg.put(tax.getTaxId(), new Aggregate(tax.getTaxId(), tax.getName(),
tax.getTaxAmount()));
}
}

最佳答案

首先,将项目的标签列表平展,然后将 Tax 对象转换为 Aggregate 对象。然后使用 Collectors.toMap 按税号映射然后合并具有相同 id 的税对象。

Map<Integer, Aggregate> resMap = items.stream()
.flatMap(item -> item.getTaxes().stream())
.map(tax -> new Aggregate(tax.getTaxId(), tax.getName(), tax.getTaxAmount()))
.collect(Collectors.toMap(Tax::getTaxId, e -> e,
(a, b) -> new Aggregate(a.getTaxId(), a.getName(),
a.getTaxAmount().add(b.getTaxAmount()))));
这里使用 Collectors.toMap map 来自 Tax::getTaxId这是 toMap 的第一个参数。下一个是 map 的 key e -> e整体 Aggregate obj 作为键。最后,合并函数中的最后一个参数将用于合并两个 Aggregate对象合二为一 Aggregate对象,以便将同一键的所有值合并为一个 Aggregate目的
Collectors.toMap(Tax::getTaxId, e -> e,    
(a, b) -> new Aggregate(a.getTaxId(), a.getName(),
a.getTaxAmount().add(b.getTaxAmount())))

关于Java 8 Query - 基于具有多个对象列表的键的分组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63172738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com