我是Java可选对象的新手,但是我看到此代码是由另一个开发人员编写的,但我没有得到:
String t = null;
Optional.ofNullable("notnull")
.orElse(
Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))
);
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会引发异常?为什么甚至转到“ orElse”分支?
这是因为执行顺序有些奇怪吗?因此,在评估orElse分支之前未设置第一个可选的值吗?
该orElse
流永远不会调用,但执行方法本身。这意味着方法参数也将传递给它。因此,Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))
无论传递给第一个Optional.ofNullable
调用的值如何,都将调用该部件。
如果您不希望发生这种情况,则需要通过Supplier
以下命令:
String t = null;
Optional.ofNullable("notnull")
.orElseGet(
() -> Optional.ofNullable(t).orElseThrow(() -> new RuntimeException("MyException"))
);
Run Code Online (Sandbox Code Playgroud)
仅在调用orElseGet
流时才调用供应商。请注意,您将需要使用a RuntimeException
而不是Checked异常,以便能够与供应商分离。
那是因为里面的代码orElse()
将总是被评估。换句话说,即使您指定了非空值Optional
,它也将被执行,这就是Exception
抛出的原因。
如果检查orElse()
的部分的Java可选-否则容易()VS orElseGet()的文章,你可以看到,在他们的榜样,在那里说:
我们可以很容易地推断出,即使有非空的Optional,也对orElse()的参数进行了评估。
归档时间: |
|
查看次数: |
144 次 |
最近记录: |