java 8 可选 map() 抛出带有函数引用但不带有完整 lambda 语法的 NPE

标签 java intellij-idea lambda java-8

这是错误还是功能?

下面因 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 is null

所以 map 方法总是抛出一个 NullPointerException,不管值是否存在,如果给定的 mappernull:这解释了第一种情况下的异常。但是,映射器仅在有值时才应用:这解释了为什么在第二种情况下没有异常。

关于java 8 可选 map() 抛出带有函数引用但不带有完整 lambda 语法的 NPE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34927110/

相关文章:

grails - Grails 3与IDEA 15集成。字节码中存在错误

java - 比较堆栈中的项目

java - 只看算法代码计算时间复杂度

intellij-idea - 如何将intellij编译错误输出语言设置为英文?

intellij-idea - 在 Intellij 的项目中包含外部文件(不是库)

c++ - 接受 lambda 问题的模板化函数

java - 如何重构嵌套的切换用例(Java)或何时重构(Kotlin)?

java - 传递函数调用方法参数 java

Java 泛型和数组

java - 在 java 中添加自定义 HTTP header