消耗 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;
});
可以说,映射函数应该用于映射而不是副作用,所以即使它有效,我也在寻找替代方案。
peek
和 peekLeft
结合起来非常接近您要查找的内容。
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);
如何以功能方式同时使用 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;
});
可以说,映射函数应该用于映射而不是副作用,所以即使它有效,我也在寻找替代方案。
peek
和 peekLeft
结合起来非常接近您要查找的内容。
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);