Java可选和orElse

bre*_*ine 6 java optional

我是Java可选对象的新手,但是我看到此代码是由另一个开发人员编写的,但我没有得到:

String t = null;
Optional.ofNullable("notnull")
    .orElse(
        Optional.ofNullable(t).orElseThrow(() -> new Exception("MyException"))
    );
Run Code Online (Sandbox Code Playgroud)

为什么这段代码会引发异常?为什么甚至转到“ orElse”分支?

这是因为执行顺序有些奇怪吗?因此,在评估orElse分支之前未设置第一个可选的值吗?

whi*_*row 8

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异常,以便能够与供应商分离。


cнŝ*_*ŝdk 5

那是因为里面的代码orElse()将总是被评估。换句话说,即使您指定了非空值Optional,它也将被执行,这就是Exception抛出的原因。

如果检查orElse()的部分的Java可选-否则容易()VS orElseGet()的文章,你可以看到,在他们的榜样,在那里说:

我们可以很容易地推断出,即使有非空的Optional,也对orElse()的参数进行了评估。