我有一个Long value
,根据某个列表是否将null作为其字段之一,应将其设置为null,而在未找到null的情况下,应将其设置为列表中这些字段的总和。 / p>
请参阅我的(工作代码)实现此目标:
Long usedBytes = bdList.stream()
.anyMatch(bd -> bd.getBytes() == null) ?
null :
bdList.stream()
.mapToLong(Backup::getBytes)
.sum();
我想知道为什么类似的代码和更简单的代码不会在其中一个字段为null的情况下将Long usedBytes
设置为null。在这种情况下,Long totalUsedSpace
设置为0L
。
Long totalUsedSpace = bdList.stream().filter(bd -> bd.bd.getBytes() != null)
.mapToLong(Backup::getBytese)
.sum();
答案 0 :(得分:3)
长java.util.stream.LongStream.sum()
如您所见,LongStream
的{{1}}方法返回sum
而不是long
,因此它永远不会返回Long
。当null
为空时,它将返回0
。
此外,如果仅在某些字段中存在LongStream
,则第二个代码段将返回非空字段的值之和。
您可以使用reduce通过一个null
管道来实现逻辑:
Stream
我无法测试此代码,但是我测试了类似的代码,该代码计算字符串长度的总和,如果任何字符串为null,则返回null:
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);
此打印
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);
如果将输入列表更改为
11
它打印
List<String> strlist = Arrays.asList ("One",null,"Two","Three");