这是错误还是功能?
下面因 NPE 而失败
Function<String, String> f = null;
Optional.<String>empty().map(f).orElse(null);
但不是
Function<String, String> f = null;
Optional.<String>empty().map(value -> f.apply(value)).orElse(null);
例如,IntelliJ 会建议用第一个表达式替换第二个表达式作为等效项,这对我来说很有意义,直到现在。
此行为的原因是 Optional#map()
的实现:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
// check happens before the branching
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}
相反,如果 map()
是通过以下方式实现的:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
if (!isPresent())
return empty();
else {
// the check happens only when relevant
Objects.requireNonNull(mapper);
return Optional.ofNullable(mapper.apply(value));
}
}
我们会在前 2 个片段之间获得一致的行为。 map()
不是第二个实现的原因是什么?
最佳答案
这不是错误,因为它已明确记录在案。引用 Optional.map(mapper)
Java文档:
If a value is present, apply the provided mapping function to it [...]
...Throws:
NullPointerException
- if the mapping function isnull
所以 map
方法总是抛出一个 NullPointerException
,不管值是否存在,如果给定的 mapper
是 null
:这解释了第一种情况下的异常。但是,映射器仅在有值时才应用:这解释了为什么在第二种情况下没有异常。
关于java 8 可选 map() 抛出带有函数引用但不带有完整 lambda 语法的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927110/