mat*_*eus 5 java lambda intellij-idea java-8
这是一个错误还是一个功能?
NPE下面失败了
Function<String, String> f = null;
Optional.<String>empty().map(f).orElse(null);
Run Code Online (Sandbox Code Playgroud)
但不是
Function<String, String> f = null;
Optional.<String>empty().map(value -> f.apply(value)).orElse(null);
Run Code Online (Sandbox Code Playgroud)
例如,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));
}
}
Run Code Online (Sandbox Code Playgroud)
相反,如果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));
}
}
Run Code Online (Sandbox Code Playgroud)
我们会在前两个片段之间获得一致的行为.任何理由map()不是第二次实施?
这不是一个错误,因为它是明确记录的.引用Optional.map(mapper)Javadoc:
如果存在值,则将提供的映射函数应用于它[...]
...抛出:
NullPointerException- 如果映射函数是null
因此,无论是否存在值,该map方法总是抛出一个NullPointerException,如果mapper给定的是null:这解释了第一种情况下的异常.但是,仅当存在值时才应用映射器:这解释了为什么在第二种情况下没有例外.
| 归档时间: |
|
| 查看次数: |
1989 次 |
| 最近记录: |