消耗 Vavr 的 "left" 和 "right" 要么?

Consume both "left" and "right" of Vavr Either?

如何以功能方式同时使用 vavr Either 的“左”或“右”?

我有一个 returns 和 Either<RuntimeException, String> 的方法。基于这个结果,我需要对我们的报告库执行回调,例如reportSuccess()reportFailure()。因此,我正在寻找一种不错的、实用的方法来做到这一点。如果 Either 有一个 biConsumer(Consumer<? super L> leftConsumer, Consumer<? super R> rightConsumer,我可以这样写:

Either<RuntimeException, String> result = // get the result from somewhere

result.biConsumer(ex -> {
  reportFailure();
}, str -> {
  repportSuccess();
});

目前为止我发现的最接近的解决方法是 biMap() 方法,它类似于

Either<RuntimeException, String> mappedResult = result.bimap(ex -> {
  reportFailure();
  return ex;
}, str -> {
  reportSuccess();
  return str;
});

可以说,映射函数应该用于映射而不是副作用,所以即使它有效,我也在寻找替代方案。

peekpeekLeft 结合起来非常接近您要查找的内容。

void reportFailure(RuntimeException e) {
    System.out.println(e);
}
void reportSuccess(String value) {
    System.out.println(value);
}

....

// prints: some value
Either<RuntimeException, String> right = Either.right("some value");
right.peekLeft(this::reportFailure).peek(this::reportSuccess);

// prints: java.lang.RuntimeException: some error
Either<RuntimeException, String> left = Either.left(
    new RuntimeException("some error")
);
left.peekLeft(this::reportFailure).peek(this::reportSuccess);