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)
有没有其他人以前经历过这种行为?这真的是选项应该表现的方式吗?
这是预期的行为.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没有得到的值).
| 归档时间: |
|
| 查看次数: |
4117 次 |
| 最近记录: |