Inicialização de fluxos de objeto usando

MENTEITH:

Eu tenho um Long valueque, dependendo se uma determinada lista tem um nulo como um de seus campos, deve ser definido como nulo e quando não nulo é encontrado deve ser definido como soma desses campos da lista.

Por favor, veja o meu (código de trabalho) que consegue isso:

Long usedBytes = bdList.stream()
                       .anyMatch(bd -> bd.getBytes() == null) ? 
                 null :
                 bdList.stream()
                       .mapToLong(Backup::getBytes)
                       .sum();

Eu estou perguntando por código simplier semelhante e muito não irá definir Long usedBytescomo nulo quando há um nulo como um de seus campos. Neste cenário Long totalUsedSpaceestá definido para 0L.

Long totalUsedSpace = bdList.stream().filter(bd -> bd.bd.getBytes() != null)
                                      .mapToLong(Backup::getBytese)
                                      .sum();
Eles foram:

longo java.util.stream.LongStream.sum ()

Como você pode ver, LongStream's summétodo retorna uma long, não um Long, por isso pode nunca mais voltar null. Ele retorna 0quando o LongStreamestá vazia.

Além disso, se houver nullapenas em alguns dos campos, o segundo trecho voltaria a soma dos valores dos campos não nulos.

Você pode conseguir sua lógica com um único Streamgasoduto usando reduzir:

Long usedBytes = bdList.stream ()
                       .reduce (Long.valueOf (0),
                                (sum,bd) -> sum == null || bd.getBytes() == null ? null : sum + bd.getBytes(),
                                (sum1,sum2) -> sum1 == null || sum2 == null ? null : sum1 + sum2);

Eu não poderia testar esse código, mas eu testei código semelhante que calcula a soma dos comprimentos de cadeia e retorna nulo se qualquer uma das cordas são nulos:

List<String> strlist = Arrays.asList ("One","Two","Three");
Long sumOfLengths = strlist.stream ()
                           .reduce (Long.valueOf (0),
                                    (sum,s) -> sum == null || s == null ? null : sum + s.length(),
                                    (sum1,sum2) -> sum1 == null || sum2 == null ? null : sum1 + sum2);
System.out.println (sumOfLengths);

Isto imprime

11

E se você alterar a lista de entrada para

List<String> strlist = Arrays.asList ("One",null,"Two","Three");

ele imprime

null

Acho que você gosta

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