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实战》读书笔记09:用 Optional 处理值为 null 的情况