-1

为什么如下代码:

/.../
.onFailure(exc ->
                        Match(exc).of(
                                Case($(instanceOf(ServerSOAPFaultException.class)), handleServerSOAPFaultException(exc)),
                                Case($(instanceOf(Exception.class)), handleDefaultException(exc))
                        ))
                .getOrElseGet(exc -> false);

当异常为 RuntimeException 时调用第一种情况。RuntimeException 不是 ServerSOAPFaultException 的实例。

4

1 回答 1

0

这是一个 Java 问题,而不是特定于 Vavr 的问题:在 Java 中,如果你编写foo(a, b)了两者a,并且b将在被评估之前foo(a, b)被评估(称为“eager”)。

所以要评估Match().of()它必须评估所有Case()。要评估每个Case()它必须评估handleServerSOAPFaultException(exc).

如果您只想handleServerSOAPFaultException(exc)在大小写匹配时进行评估,则需要将其设为惰性调用,即函数,即 a Supplier

/.../
.onFailure(exc ->
                        Match(exc).of(
                                Case($(instanceOf(ServerSOAPFaultException.class)), () -> handleServerSOAPFaultException(exc)),
                                Case($(instanceOf(Exception.class)), () -> handleDefaultException(exc))
                        ))
                .getOrElseGet(exc -> false);
于 2019-05-02T20:40:43.517 回答