orElse-Branch中的可选项会抛出异常

Num*_*ick 6 java exception-handling optional java-8

所以我正在使用Optionals并遇到了一个奇怪的行为.我想知道这是否真的是一个强大的"功能"或什么...奇...

下面是给出的示例:我有一个带有Optional的方法,其中orElse我想评估另一个可选项.如果其他Optional不存在,我将引发IllegalArgumentException:

firstOptionalVar.orElse(secondOptionalVar.orElseThrow(IllegalArgumentException::new));
Run Code Online (Sandbox Code Playgroud)

现在,如果它secondOptionalVar是一个空的Optional,它将引发IllegalArgumentException,即使它firstOptionalVar是Present.这对我来说似乎不对.如果firstOptionalVar不存在,我希望它只会引发IllegalArgumentException .

用java7方法来解决这种行为并不是什么大问题:

firstOptionalVar.isPresent() ? firstOptionalVar.get() : secondOptionalVar.orElseThrow(IllegalArgumentException::new);
Run Code Online (Sandbox Code Playgroud)

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

res*_*man 8

这是预期的行为.orElse期望一个类型的参数T(无论是泛型的泛型类型Optional.orElseThrow返回a T,因此需要首先对其进行求值,以便将参数传递给orElse.

你想要的是什么orElseGet,需要一个Supplier<T>.这将延迟执行orElseThrow直到firstOptionalVar已经检查过.

所以你的代码应该是这样的:

firstOptionalVar.orElseGet(() -> secondOptionalVar.orElseThrow(IllegalArgumentException::new));
Run Code Online (Sandbox Code Playgroud)

这会将该orElseThrow部分转换为lambda,并且仅在需要时才进行评估(即,何时firstOptionalVar没有得到的值).

  • 好一个.这是我一直想弄清楚的解决方案.:) (2认同)