我有嵌套的列表,我想使用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
您必须使用两个,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
;assetList
,而是s
在例如assets
或末尾使用accounts
。
抱歉,我将assetId更改为Long,并且我的分组应从子帐户开始,并开始到assetList。我理解->代表资产,而S->代表子帐户。这个对吗?
@ sk27我更改了名称以使其更清晰,请检查我的编辑并清楚阅读注释,希望这对您有所帮助
@ sk27我不明白您的意思,我的分组应该从子帐户开始,再到assetList,请问您是什么类型的
assetList
我无法编辑帖子。它不是帐户,它只是帐户,并且帐户具有SubAccounts,而我里面有Assets。基本上,子帐户和资产都是列表。
您好,谢谢您,感谢您的耐心等待,我能够按照您在解决方案中所说的达到平面图。