当前位置: 首页 > 面试题库 >

orElse-Branch中的可选抛出Exception

哈烨熠
2023-03-14
问题内容

所以我正在与Optionals一起工作,并且遇到了一种奇怪的行为。我想知道这是否真的是意向性的“功能”或其他…奇特的…

这是给定的示例:我有一个带有Optional的方法,在其中我要评估另一个Optional的方法。如果其他Optional不存在,我将引发IllegalArgumentException:

firstOptionalVar.orElse(secondOptionalVar.orElseThrow(IllegalArgumentException::new));

现在,如果the secondOptionalVar为空的Optional,即使存在,它也会引发IllegalArgumentException
firstOptionalVar。这对我来说似乎不对。如果firstOptionalVar不存在,我希望它只会引发IllegalArgumentException


用以下类似的java7html" target="_blank">方法避免这种行为不是什么大问题:

firstOptionalVar.isPresent() ? firstOptionalVar.get() : secondOptionalVar.orElseThrow(IllegalArgumentException::new);

有没有其他人经历过这种行为?这真的是可选选项应该表现的方式吗?


问题答案:

这是预期的行为。orElse期望使用T类型为实参的参数(无论Optionalis。的通用类型如何,都orElseThrow返回a
T,因此需要首先对其求值,以便将参数传递给orElse

你想要的是orElseGet,这需要一个Supplier<T>。这将延迟执行orElseThrow直到firstOptionalVar被检查。

因此,您的代码应如下所示:

firstOptionalVar.orElseGet(() -> secondOptionalVar.orElseThrow(IllegalArgumentException::new));

这将把该orElseThrow部分变成一个lambda,并且仅在需要时对其进行评估(即,何时firstOptionalVar没有值可获取)。



 类似资料:
  • 我一直在使用Java 8中的新的可选类型,我遇到了一个似乎不受功能支持的常见操作:“orelseoptional” 请考虑以下模式: 这种模式有很多种形式,但归结起来就是在一个可选项上需要一个“orelse”,该“orelse”接受一个函数,生成一个新的可选项,只有当当前的可选项不存在时才调用。 它的实现如下所示: 我很好奇这样一种方法不存在的原因,如果我只是在一种无意的方式下使用Optional

  • 为什么这段代码会抛出异常?为什么它还要去“奥雷尔斯”分店? 这是因为某种怪异的处决令吗?那么在计算orElse分支之前没有设置第一个可选项的值?

  • 在Optional while Optional.orElse方法被调用时,无论元素是否存在,都不执行orElse部分,它的行为不像if else条件那样。 在下面的代码中,如果您在案例1中看到getNullPoJo和getDefaultPoJo都被执行,因为getNullPoJo将返回空的可选的 当前输出为: 正在执行getNullPoJo 执行getDefaultPoJo pojo1获得默认值

  • 在许多地方,我得到了几个已检查的异常,如IOException、ParseException、JSoneException等。我必须做出两个选择之一- > 通过在方法签名的末尾添加抛出来抛出相同的异常。 将检查的异常包装在RuntimeException(或一些自定义实现)中,然后抛出它,以便调用者不必在任何地方添加throws子句并检查异常。 在第一种情况下,我将不得不到处抛出,但我的客户可以通

  • 是否可以使用可选选项重写以下内容?在我看来,当情况需要抛出异常时,使用可选可能不是一个好主意? 尝试1: 尝试2:

  • 我刚刚偶然发现了一个由IntelliJ生成的警告,我想知道,我是错过了什么,还是IntelliJ只是忽略了下面or子句的右侧? 示例代码: 警告是可选的。没有“isPresent()”检查的get()'显示在b上。get()。我知道or是以一种惰性的方式从左到右计算的,但我假设无论是a还是b都必须有一个值,因为它在if中被显式检查。 这是IntelliJ静态代码分析中的错误吗?