如何在尝试从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
,那该怎么办?
答案 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()
仍然存在问题。
我们希望在未来的版本中进一步改善这种情况,但可能需要一些时间来吸引更多的社区。 p>
答案 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)
实现作为明确的替代方案。