Java 8 查询 - 基于多个对象列表的 Key 的分组计算

标签 java java-8

我需要 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 中,但我希望在 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进行映射,然后合并具有相同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/

相关文章:

java - 在线程 "main"java.lang.IndexOutOfBoundsException : No group 1 中得到异常

Java 8 Streams : multiple filters vs. 复杂情况

java - 携带相同时间戳的对象的值累加

java - 在 Java 8 中从 Stream of Streams 中提取 Map<K, Multiset<V>>

java - 在运行时识别子类

java - 在 Quartz 作业中使用 Struts2 国际化功能

java - 在 Rxjava 中创建线程

java - 如何使用反射在 Java 8 中获取方法参数名称?

java - 日期时间解析异常 : Text could not be parsed at index 2

java - 替换/添加字符串中的字符集