温馨提示:本文翻译自stackoverflow.com,查看原文请点击:java - grouping and sum with nested lists
grouping java java-8 java-stream

java - 分组并与嵌套列表求和

发布于 2020-04-13 17:03:52

我有嵌套的列表,我想使用java流和收集器进行分组和求和以获得所需的结果。有了这个我不能循环多个SubAccounts我必须使用for循环或其他某种逻辑。我想使用流API实现。有没有可能

Map<Long, BigDecimal> assetQuanMap = subAccounts.getAssets.parallelStream().collect(Collectors.groupingBy(Asset::getAssetId, Collectors.reducing(BigDecimal.ZERO, Asset::getQuantity, BigDecimal::add)));

我有下面的类或表示形式:

    Account
        SubAccount1
            Assets
                1 - 20
                2 - 30
                3 - 40
        SubAccount2
            Assets
                1 - 10
                2 - 5
                3 - 3
        SubAccount3

                1 - 3
                2 - 3
                3 - 4

帐户类如下:

Public class Account{
  List<SubAccounts> list;
}

Public Class SubAccounts    {
   List<Assets> list;
}

Public class Assets{
    Long assetId;
    BigDecimal quantity ;
}

我想在Map中获得如下结果。基本上,对于每个子帐户,我都需要在帐户级别对资产进行分组,如下所示

1 - 33
2 - 38
3 - 47

查看更多

提问者
sk27
被浏览
63
YCF_L 2019-03-26 02:45

您必须使用两个,flatMap以便可以分组assetId

Map<String, BigDecimal> collect = accounts.stream()
        .flatMap(account -> account.getList().stream())
        .flatMap(subAccount -> subAccount.getList().stream())
        .collect(Collectors.groupingBy(Assets::getAssetId,
                Collectors.reducing(
                        BigDecimal.ZERO, 
                        Assets::getQuantity,
                        BigDecimal::add)
        ));

从您的代码中assetId是一个字符串,因此map的键应该是一个字符串,或者您必须对其进行转换,或者在您的类中对其进行更改,例如:

Map<Long, BigDecimal> collect = accounts.stream()
        .flatMap(account -> account.getList().stream())
        .flatMap(subAccount -> subAccount.getList().stream())
        .collect(Collectors.groupingBy(asset -> Long.valueOf(asset.getAssetId()),
                Collectors.reducing(
                        BigDecimal.ZERO,
                        Assets::getQuantity,
                        BigDecimal::add
                )
        ));

笔记

  • 不要在类名中使用复数形式;
  • 不要将变量命名为list,请使用另一个有效的名称;
  • 不要将其assetId用作属性的名称,而应只使用use id
  • 不要在变量名下使用List assetList,而是s在例如assets末尾使用accounts