gpt4 book ai didi

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

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

这是错误还是功能?

下面因 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/

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