Java Optional 与传统的缺失值处理有何不同?或者如何正确使用Java Optional [重复]

Posted

技术标签:

【中文标题】Java Optional 与传统的缺失值处理有何不同?或者如何正确使用Java Optional [重复]【英文标题】:How is Java Optional different from traditional handling of missing value? Or how to use Java Optional correctly [duplicate] 【发布时间】:2018-10-20 21:49:21 【问题描述】:

在我看来,Optional 对代码流控制和缺失值处理几乎没有什么作用。如果未找到可选项后面的值,仍然需要处理缺少该值的问题 - 那有什么意义呢?

比较:

Optional someMissingVal = codeThatReturnsOptional.getOptionalValue().orElse(null);
if( someMissingVal == null)
    throw(new NullPointerException());
 
else return someMissingVal.get();

Type someMissingVal = codeThatReturnsType.getTypeValue();
    if( someMissingVal == null)
        throw(new NullPointerException());
     
    else return someMissingVal;

那么有什么大不了的,我如何在上述场景中使用 Optional 来充分发挥其功能 - 而不是“旧式”缺失值处理?

【问题讨论】:

好问题。我不是 java-8-super-hacker,但似乎 net 中的一些示例是错误的(以“旧”样式),尤其是在调用堆栈很深时 在您的第一个示例中,someMissingVal 不是Optional 类型。除此之外,这两个例子都有缺陷。当您调用已记录为可能返回 null(或空的可选)的方法时,如果确实如此,则抛出 NullPointerException 是没有意义的。您应该处理该场景。除此之外,执行非null 值可以更简单:return Objects.requireNonNull( codeThatReturnsType.getTypeValue()); 【参考方案1】:

您可以将您的第一个 sn-p 简化如下

return codeThatReturnsOptional.getOptionalValue()
                .orElseThrow(() -> new NullPointerException());

它现在是否简化了您的代码?它也使它可读。

使用 Optional 可以做很多事情。这个来自 Oracle 的 article 解释了它。

【讨论】:

【参考方案2】:

您可以像这样即时进行null 检查:

public static void main(String[] args) 
    String s = null;
    String newS = Optional.ofNullable(s).orElse("default");

以及抛出异常:

public static void main(String[] args) 
    String s = null;
    String newS = Optional.ofNullable(s).orElseThrow(IllegalArgumentException::new);

使用一些条件语句:

public static void main(String[] args) 
    String s = "test";
    Optional.ofNullable(s).ifPresent(System.out::print);

在更复杂的场景中与Streams 一起使用。

【讨论】:

以上是关于Java Optional 与传统的缺失值处理有何不同?或者如何正确使用Java Optional [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如果每个业务逻辑都不允许缺失值,为啥要使用 Optional.of 方法[重复]

Java8特性:Optional空值处理

Java8特性:Optional空值处理

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

《Java8实战》读书笔记09:用 Optional 处理值为 null 的情况

Swift之深入解析可选类型Optional的底层原理