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
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
list
, use another significant name;assetId
as a name of attribute instead use just use id
;assetList
, instead use s
in the end for example assets
or accounts
.
sorry i changed assetId to Long its mistake, and my grouping should start from subaccounts and to assetList. i understood a -> reprsents asset and s->represents subaccounts . Is this correct?
@sk27 I changed the names to make it more clear, check my edit and read the notes clearly please, hope this can help you
@sk27 I don't get you and my grouping should start from subaccounts and to assetList can you clarify please, what is the type of
assetList
im not able to edit the post. Its not Accounts it is just Account and Account has SubAccounts and inside i have Assets. Basically Subaccounts and Assets are lists.
hi thank u and for your patience in answering ,im able to acheive with flatmap as you said in ur solution.