Optional.get() 与重载 Optional.orElseThrow()

2022-09-02 05:06:11

如何避免显式抛出一个尝试从或同时使用 Optional.get 获取值的时间?ExceptionOptional

目前,这可能通过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();

如果有人想确保任何一个都有一个值,如果没有,他们就不想继续向前传播,该怎么办?Optionalnull


答案 1

Java 8对平台来说是一个巨大的改进,但是我们犯的为数不多的错误之一就是 命名,因为这个名字只是邀请人们在不调用的情况下调用它,破坏了首先使用的整个要点。(如果这是我们在这么大的版本中犯的最严重的错误,那么我们做得很好。Optional.get()isPresent()Optional

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

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


答案 2

从我的角度来看,是代码的气味。很多时候与,它完全违背了目的和思想。以下是更完整的推理和讨论:Optional.get()Optional.isPresent()Optional.get()

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

所以干脆不要使用.如果要返回缺少的值,请调用 。Optional.get()nullOptional.orElse(null)


推荐