Eu tenho um Long value
que, 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 usedBytes
como nulo quando há um nulo como um de seus campos. Neste cenário Long totalUsedSpace
está definido para 0L
.
Long totalUsedSpace = bdList.stream().filter(bd -> bd.bd.getBytes() != null)
.mapToLong(Backup::getBytese)
.sum();
longo java.util.stream.LongStream.sum ()
Como você pode ver, LongStream
's sum
método retorna uma long
, não um Long
, por isso pode nunca mais voltar null
. Ele retorna 0
quando o LongStream
está vazia.
Além disso, se houver null
apenas 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 Stream
gasoduto 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