我需要 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 |描述 |金额-14卢比
税-2 |姓名-B |描述 |金额-10卢比
税-2 |姓名-B |描述 |金额-18卢比
我能够通过循环遍历每个对象并将其添加到映射
全局变量 - 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进行映射,然后合并具有相同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
通过 Tax::getTaxId
进行映射,这是 toMap 的第一个参数。下一个是以整个Aggregate
obj 为键的映射e -> e
的键。最后,合并函数中的最后一个参数将用于将两个 Aggregate
对象合并为一个 Aggregate
对象,以便同一键的所有值合并为一个 聚合
对象
Collectors.toMap(Tax::getTaxId, e -> e,
(a, b) -> new Aggregate(a.getTaxId(), a.getName(),
a.getTaxAmount().add(b.getTaxAmount())))
关于Java 8 查询 - 基于多个对象列表的 Key 的分组计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63172738/