gpt4 book ai didi

java - 在只有一个元素的列表上调用 stream().reduce()

转载 作者:搜寻专家 更新时间:2023-10-30 19:51:37 24 4
gpt4 key购买 nike

我是 java 函数式编程的新手,想知道我应该如何编写代码来避免(例如)此操作中的 NPE:

myList.stream()
.reduce((prev, curr) -> prev.getTimestamp().isAfter(curr.getTimestamp()) ? prev : curr);
.get().getTimestamp();

我的目的是找到列表中最新对象的时间戳。关于如何更好地收集最后一个元素的建议非常受欢迎,但我在这里的主要问题实际上是为什么这样做有效。

文档说该函数抛出一个 NullPointerException “如果归约的结果为 null”:

http://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#reduce-java.util.function.BinaryOperator-

没关系,但我不太明白的是,为什么当此代码运行一个仅包含一个元素的列表时,我没有得到 NullPointerException。在这种情况下,我希望 prev 为空。我试过调试,但当只有一个元素时,它似乎跳过了整个 lambda 表达式。

最佳答案

作为 reduce 的 JavaDoc说,减少相当于:

 boolean foundAny = false;
T result = null;
for (T element : this stream) {
if (!foundAny) {
foundAny = true;
result = element;
}
else
result = accumulator.apply(result, element);
}
return foundAny ? Optional.of(result) : Optional.empty();

因此,如果 Stream 只有一个元素,则循环只有一次迭代,并返回在该迭代中找到的单个元素。

只有 Stream 至少有两个元素时,才会应用 BinaryOperator

关于java - 在只有一个元素的列表上调用 stream().reduce(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27123996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com