Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java可选与传统的缺失值处理有何不同?或者如何正确使用Java Optional_Java_Java 8_Optional - Fatal编程技术网

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);
}