Optional.get()Vs重载了Java-10

时间:2018-03-07 18:21:24

标签: java optional java-10

如何在尝试从Exception获取值或使用 Optional.get 时明确抛出Optional

目前,使用API​​ orElseThrow可以保护这一点:

// exception could be replaced with any other
Integer opt = anyOddInStream.orElseThrow(
                           () -> new NoSuchElementException("No value present"));

然而在尝试访问

之类的内容时直接实现了get令人失望(当一个人可能不愿意明确抛出异常时)
// the following not only just fails but throws an exception as well
Integer previous = anyOddInStream.get();

如果要确保Optional有值,如果它们不想继续传播null,那该怎么办?

3 个答案:

答案 0 :(得分:27)

Java 8是该平台的一项重大改进,但我们犯的少数错误之一就是Optional.get()的命名,因为该名称只是邀请人们在不调用isPresent()的情况下调用它,从而破坏了首先使用Optional的重点。 (如果这是我们在如此大的版本中犯下的最大错误,那么我们做得非常好。)

在Java 9时间框架内,我们建议弃用Optional.get(),但公众对此的回应是......让我们说冷。作为一个较小的步骤,我们在10中引入orElseThrow()(请参阅https://bugs.openjdk.java.net/browse/JDK-8140281)作为get()当前有害行为的更透明命名的同义词。 IDE警告无条件使用get(),但不会orElseThrow(),这是教导人们更好地编写代码的一步。从某种意义上说,问题是对当前形势的“玻璃半空”观点; get()仍然存在问题。

我们希望在未来的版本中进一步改善这种情况,但可能需要一些时间来吸引更多的社区。

答案 1 :(得分:6)

从我的角度来看,Optional.get()是代码气味。它经常与Optional.isPresent()结合使用,完全违背了Optional.get()的目的和想法。这是一个更完整的推理和讨论:

http://royvanrijn.com/blog/2016/04/deprecating-optional-get/

所以根本不要使用Optional.get()。如果您想为缺席值返回null,请致电Optional.orElse(null)

答案 2 :(得分:3)

另一种获取可选项而不是Optional.get的值的方法(更可能无法满足用户的期望)是用JDK10中引入的更详细的API替换它如 Optional.orElseThrow() 。在author's words -

  

Optional.get()是一个有吸引力的滋扰"并且太诱人了   程序员,导致频繁的错误。 人们不期待吸气   抛出异常。 Optional.get()的替换API   应该添加等效的语义。

Optional<Integer> anyOddInStream = Stream.of(2, 4, 6, 8)
                                         .filter(x -> x % 2 == 1)
                                         .findAny();
// one could be well aware of the possible exception handling while reading this 
var current = anyOddInStream.orElseThrow(); 

注意 : - 这两个API的底层实现是相同的,但后者更清楚地读出 NoSuchElementException默认情况下会抛出 ,如果该值不存在,则内联消费者使用的现有Optional.orElseThrow(Supplier<? extends X> exceptionSupplier)实现作为明确的替代方案。