使用流初始化对象

时间:2018-07-11 08:45:33

标签: java lambda java-8 java-stream

我有一个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();

1 个答案:

答案 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");