gpt4 book ai didi

java - 使用嵌套列表进行分组和求和

转载 作者:搜寻专家 更新时间:2023-10-31 19:51:44 26 4
gpt4 key购买 nike

我有嵌套列表,我正在尝试使用 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 中获得如下结果。基本上对于每个子账户,我需要在账户级别对 Assets 进行分组,如下所示

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 作为属性的名称,而是使用 id;
  • 不要在变量名 assetList 中使用 List,而是在最后使用 s 例如 assetsaccounts

关于java - 使用嵌套列表进行分组和求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55343820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com