Tengo listas anidadas y estoy tratando de agrupar y sumar para obtener el resultado deseado usando corrientes de Java y los colectores. Con esto no estoy en condiciones de bucle sobre múltiples SubAccounts
. Ya sea que tengo que usar para el bucle o alguna otra lógica. Quiero lograr usando API de Secuencia. ¿Hay alguna posibilidad de que se
Map<Long, BigDecimal> assetQuanMap = subAccounts.getAssets.parallelStream().collect(Collectors.groupingBy(Asset::getAssetId, Collectors.reducing(BigDecimal.ZERO, Asset::getQuantity, BigDecimal::add)));
Estoy teniendo el siguiente clases o representación:
Account
SubAccount1
Assets
1 - 20
2 - 30
3 - 40
SubAccount2
Assets
1 - 10
2 - 5
3 - 3
SubAccount3
1 - 3
2 - 3
3 - 4
Cuentas miradas clase como:
Public class Account{
List<SubAccounts> list;
}
Public Class SubAccounts {
List<Assets> list;
}
Public class Assets{
Long assetId;
BigDecimal quantity ;
}
Estoy intentando conseguir el resultado que a continuación en el mapa. Básicamente para cada una de las subcuentas i necesidad de agrupar los activos a nivel de la cuenta que se parece a continuación
1 - 33
2 - 38
3 - 47
Usted tiene que usar dos flatMap
por lo que se pueden agrupar porassetId
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)
));
a partir del código assetId
es una cadena así que la clave del mapa debe ser una cadena, o tienes que convertirlo, o cambiarla en su clase, así:
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
)
));
notas
- no use plurales en el nombre de clases;
- no nombre variable como
list
, utilizar otro nombre significativo; - no use
assetId
como un nombre de atributo en lugar de utilizar solo usoid
; - no utilizar la lista en el nombre de variables
assetList
, en lugar de utilizars
al final, por ejemplo,assets
oaccounts
.