Java 折叠其中一个以返回不同的值

Java 折叠其中一个以返回不同的值,java,functional-programming,either,vavr,Java,Functional Programming,Either,Vavr,我有一个Vavr,看起来像这样: Either<DomainError, Boolean> maybePendingPayment = ... 但看起来我做不到,因为fold希望我返回相同的类型: [ERROR] lower bounds: io.vavr.control.Either<xxx.yyy.DomainError,java.util.Optional<xxx.yyy.GenericType>>,java.lang.Object [ERRO

我有一个Vavr,看起来像这样:

Either<DomainError, Boolean> maybePendingPayment = ...
但看起来我做不到,因为fold希望我返回相同的类型:

[ERROR]     lower bounds: io.vavr.control.Either<xxx.yyy.DomainError,java.util.Optional<xxx.yyy.GenericType>>,java.lang.Object
[ERROR]     lower bounds: java.util.Optional<T>,java.util.Optional<T>,xxx.yyy.DomainError
[ERROR]下限:io.vavr.control.other,java.lang.Object
[错误]下限:java.util.Optional、java.util.Optional、xxx.yyy.DomainError

除了用if-else检查左右两侧外,我还有什么办法可以做得更好吗?

折叠
应用到你的
中,或者
将(顾名思义)折叠并应用左或右函数,返回应用函数的结果

通过以下示例,我试图更清楚地说明发生了什么:

    public Optional<Object> verify() {
        Either<DomainError, Boolean> maybePendingPayment = Either.right(true);
        return maybePendingPayment.fold(Optional::of, pendingPayment -> pendingPayment ? Optional.of("pending payment") : Optional.empty());
    }
public可选验证(){
或者maybePendingPayment=或者.right(true);
return-maybePendingPayment.fold(可选::of,pendingPayment->pendingPayment?可选.of(“待定付款”):可选.empty();
}

如您所见,我为函数返回类型选择了
Optional
,并将折叠的左函数也包装在Optional中。当展开
时,返回类型要么是
可选的
,要么是正确函数的结果(在我的示例中是
字符串
可选的。空的
)。如果您试图返回的对象有一个公共超类型(介于
GenericType
DomainError
),则可以选择此超类型作为函数的返回类型,而不是
对象

的一个用例是对可能产生错误的计算进行编码。如果您折叠了这种类型的值,那么您将失去这种抽象,并且需要再次处理错误。为了使
折叠
-或
类型的消除规则安全,两种情况都需要返回相同类型的值。通常,默认值用于错误情况。如果您没有有意义的默认值,那么您应该保留
,而是使用functor、applicative和monad将函数提升到上下文中。这很有意义。感谢@scriptum的解释!
    public Optional<Object> verify() {
        Either<DomainError, Boolean> maybePendingPayment = Either.right(true);
        return maybePendingPayment.fold(Optional::of, pendingPayment -> pendingPayment ? Optional.of("pending payment") : Optional.empty());
    }