grouping and sum with nested lists

情到浓时终转凉″ 提交于 2020-05-13 04:55:11

问题


I have nested lists and I'm trying to group and sum to get the desired result using java streams and collectors . With this I'm not able to loop over multiple SubAccounts. Either I have to use for loop or some other logic. I want to achieve using streams api. Is there any possibility for that

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

I'm having the below classes or representation :

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

                1 - 3
                2 - 3
                3 - 4

Accounts class looks like :

Public class Account{
  List<SubAccounts> list;
}

Public Class SubAccounts    {
   List<Assets> list;
}

Public class Assets{
    Long assetId;
    BigDecimal quantity ;
}

I'm trying to get the result as below in Map . Basically for each of the subAccounts i need to group the assets at account level which looks similar to below

1 - 33
2 - 38
3 - 47

回答1:


You have to use two flatMap so you can group by 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)
        ));

from your code assetId is a String so the key of map should be a String, or you have to convert it, or change it in your class, like so :

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
                )
        ));

Notes

  • don't use plurals in the name of classes;
  • don't name variable as list, use another significant name;
  • don't use assetId as a name of attribute instead use just use id;
  • don't use List in the name of variables assetList, instead use s in the end for example assets or accounts.


来源:https://stackoverflow.com/questions/55343820/grouping-and-sum-with-nested-lists

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!