当前位置: 首页 > 知识库问答 >
问题:

Java8流组由多个属性和总和

秦才
2023-03-14

我有一个对象列表,如下所示,我想将它们按3个属性分组,并将第4个属性相加

public class DTO {
    private final  String at1;
    private final  String at2;
    private final  Integer at3;
    private final  BigDecimal amount;

}

我做了如下类似的事情,但它生成了许多地图,我无法得到求和的方法,因为它也需要一些逻辑

List<DTO> list = ...
Map<String, Map<String, Map<Integer, List<DTO>>>> groupedItems =
                list.stream()
                .collect(
                Collectors.groupingBy(e -> e.getAt1(), 
                    Collectors.groupingBy(e -> e.getAt2(),
                                Collectors.groupingBy( e -> e.getAt3()))));

如何使用和逻辑获取分组列表列表?

共有1个答案

冯阳成
2023-03-14

您可以创建一个构造函数来保存要分组的三个属性:

public DTO(String at1, String at2, Integer at3) {
    this.at1 = at1;
    this.at2 = at2;
    this.at3 = at3;
}

然后您可以使用:

Map<DTO, BigDecimal> groupedItems = list.stream()
        .collect(Collectors.groupingBy(e -> new DTO(e.getAt1(), e.getAt2(), e.getAt3()),
                Collectors.reducing(
                        BigDecimal.ZERO,
                        DTO::getAmount,
                        BigDecimal::add)));

我假设您在DTO类中重写了equals和hashCode。

例子:

List<DTO> list = new ArrayList<>();
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(10)));
list.add(new DTO("z", "y", 4, BigDecimal.valueOf(20)));
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(30)));
list.add(new DTO("a", "b", 1, BigDecimal.valueOf(40)));

产出

DTO{at1='a', at2='b', at3=1, amount=null} - 80
DTO{at1='z', at2='y', at3=4, amount=null} - 20
 类似资料:
  • 哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。 假设我有一个类型,其属性为。假设我有这些用户的地图 ?

  • 我有一个按月-年字符串属性排序的对象列表。我的对象类定义如下 我想对会员人数、非会员人数、会员付款、非会员付款进行累计和 所以我的新对象列表如下 我尝试与但它给我所有的总和不累积。 非常感谢任何指点。

  • 我想总结我的对象的属性。对象有这样的结构: 我已经将它们收集到一个列表中,并希望(使用streams)得到一个所有元素的列表,其中只包含名称以及价格和费用的总和。例如: 应导致以下结果:

  • 我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例:

  • 给java类一些东西 我有一张物品清单 我希望能够对它们进行排序,这样它们就可以按照每个父对象的虚数的累积和排序,然后再按照虚数排序。 所以我最终 我知道用parentKey和sum of noThings映射它是 我想,也许包装我的Something类并获得每个父项的总密钥可能会在某种程度上起作用。 但看起来工作量很大,不太优雅。 如有任何意见/想法,将不胜感激。

  • 有许多java第三方库可用于在Java集合中提供高性能。根据这篇DZONE文章,有一些本机库遵循OSGI模型,并在Java集合中提供高性能,或者还执行一些其他操作。现在在中启动了以在集合库中提供良好的性能,我们还使用执行一些并行操作。现在,以下是我的问题: Java Streams的性能是否比第三方库(,等)更好。 是否可以将与其他集合库一起使用?