代码之家  ›  专栏  ›  技术社区  ›  k13i

之间的差异可选。获取()和可选.orelsetrow()[副本]

  •  -1
  • k13i  · 技术社区  · 6 年前

    如何避免明确抛出 Exception 在试图从 Optional Optional.get ?

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

    如果有人想确保 可选 null 在前面?

    0 回复  |  直到 6 年前
        1
  •  38
  •   Brian Goetz    7 年前

    Java8是对平台的一个巨大改进,但我们犯的少数几个错误之一是 Optional.get() isPresent() ,破坏了使用 Optional 首先。(如果这是我们在这么大的版本中犯下的最严重的错误,那么我们做得相当不错。)

    在Java9时间范围内,我们建议 可选。获取() ,但公众对此的反应是。。。我们说冷吧。作为一个较小的步骤,我们引入了 orElseThrow() 在10(见 https://bugs.openjdk.java.net/browse/JDK-8140281 )作为一个更透明的命名同义词的当前有害行为的 get() 获取() ,但不是开着 orElseThrow() 获取() 仍然存在问题。

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

        2
  •  6
  •   Naman    7 年前

    Optional.get() 是代码的味道。经常与 Optional.isPresent() ,它完全违背了 可选。获取() . 下面是一个更完整的推理和讨论:

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

    所以不要使用 null 对于缺少的值,请调用 Optional.orElse(null) .

        3
  •  3
  •   Naman    6 年前

    Optional.get (这很可能跟不上用户的期望)是用JDK10中引入的更详细的API来代替它,称为 Optional.orElseThrow() . 在 author's words -

    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) 消费者用作显式替代方案的实现。