agrupación y suma con listas anidadas

SK27:

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
YCF_L:

Usted tiene que usar dos flatMappor 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 assetIdes 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 assetIdcomo un nombre de atributo en lugar de utilizar solo uso id;
  • no utilizar la lista en el nombre de variables assetList, en lugar de utilizar sal final, por ejemplo, assetso accounts.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=179659&siteId=1
Recomendado
Clasificación