为什么要输入以下代码:
/.../
.onFailure(exc ->
Match(exc).of(
Case($(instanceOf(ServerSOAPFaultException.class)), handleServerSOAPFaultException(exc)),
Case($(instanceOf(Exception.class)), handleDefaultException(exc))
))
.getOrElseGet(exc -> false);
当异常为RuntimeException时调用第一种情况。 RuntimeException不是ServerSOAPFaultException的实例。
答案 0 :(得分:0)
这是Java问题,而不是特定于Vavr的问题:在Java中,如果您编写foo(a, b)
,则a
和b
都将被评估,然后再评估foo(a, b)
(称为“渴望”)。
因此,要评估Match().of()
,它必须评估所有Case()
。要评估每个Case()
,它必须评估handleServerSOAPFaultException(exc)
。
如果仅在大小写匹配时才想评估handleServerSOAPFaultException(exc)
,则需要使其成为惰性调用,即函数,即Supplier
:
/.../
.onFailure(exc ->
Match(exc).of(
Case($(instanceOf(ServerSOAPFaultException.class)), () -> handleServerSOAPFaultException(exc)),
Case($(instanceOf(Exception.class)), () -> handleDefaultException(exc))
))
.getOrElseGet(exc -> false);