折叠到 return 不同的值

Fold either to return different value

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

Either<DomainError, Boolean> maybePendingPayment = ...

我想将此响应折叠到 return Either

return maybePendingPayment.fold(domainError -> domainError, pendingPayment ? GenericType.builder().build() : Optional.empty())

但看起来我做不到,因为 fold 要我 return 相同的类型:

[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

除了用 if-else 检查左侧和右侧之外,有什么方法可以让我以更奇特的方式做到这一点?

fold 应用于您的 Either 将(顾名思义)折叠它并应用左或右函数,return 应用函数的结果。

通过以下示例,我试图更清楚地说明正在发生的事情:

    public Optional<Object> verify() {
        Either<DomainError, Boolean> maybePendingPayment = Either.right(true);
        return maybePendingPayment.fold(Optional::of, pendingPayment -> pendingPayment ? Optional.of("pending payment") : Optional.empty());
    }

如您所见,我为 return 类型的函数选择了 Optional<Object> 并将折叠的左侧函数也包装在一个 Optional 中。展开 Either 时,您的 return 类型将是 Optional<DomainError> 或正确函数的结果(在我的示例中为 StringOptional.empty)。如果您尝试 return(在 GenericTypeDomainError 之间)有一个共同的超类型,您可以选择这个作为函数的 return 类型而不是Object.