我有嵌套列表,我正在尝试使用 java 流和收集器进行分组和求和以获得所需的结果。这样我就无法循环多个SubAccounts
。我必须使用 for 循环或其他一些逻辑。我想使用streams 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
你必须使用两个flatMap https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#flatMap-java.util.function.Function-这样你就可以分组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<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
- 不要在类名中使用复数;
- 不要将变量命名为
list
,使用另一个重要的名称;
- 不要使用
assetId
作为属性的名称而不是使用只是使用id
;
- 不要在变量名称中使用 List
assetList
,改为使用s
最后例如assets
or accounts
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)