Java可选与传统的缺失值处理有何不同?或者如何正确使用Java Optional
在我看来,它似乎对代码流控制和缺失值处理几乎没有增加。如果在一个可选项后面找不到一个值,我们仍然需要处理缺少该值的问题——那么这有什么意义呢 比较:Java可选与传统的缺失值处理有何不同?或者如何正确使用Java Optional,java,java-8,optional,Java,Java 8,Optional,在我看来,它似乎对代码流控制和缺失值处理几乎没有增加。如果在一个可选项后面找不到一个值,我们仍然需要处理缺少该值的问题——那么这有什么意义呢 比较: Optional someMissingVal = codeThatReturnsOptional.getOptionalValue().orElse(null); if( someMissingVal == null){ throw(new NullPointerException()); } else return someMissi
Optional someMissingVal = codeThatReturnsOptional.getOptionalValue().orElse(null);
if( someMissingVal == null){
throw(new NullPointerException());
}
else return someMissingVal.get();
vs
那么,在上面的场景中,与“旧式”缺失值处理相反,有什么大不了的,我如何使用Optional来充分利用其功能呢?您可以将第一个代码片段简化如下
return codeThatReturnsOptional.getOptionalValue()
.orElseThrow(() -> new NullPointerException());
它现在简化了你的代码吗?它也使它可读
你可以做很多选择。Oracle对此进行了解释。您可以动态执行
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);
}
在更复杂的场景中,将其与
流一起使用 好问题。我不是java-8-super-hacker,但似乎网络中的一些示例是错误的(以“旧”风格),特别是在第一个示例中调用堆栈时,someMissingVal
不是可选的类型。除此之外,这两个例子都有缺陷。当您调用一个被记录为可能返回null
(或空可选)的方法时,如果它返回NullPointerException
,则抛出它是没有意义的。您需要处理该场景。除此之外,强制使用非null
值可以简单得多:返回Objects.requirennull(codeThatReturnsType.getTypeValue())代码>。
public static void main(String[] args) {
String s = "test";
Optional.ofNullable(s).ifPresent(System.out::print);
}