折叠到 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>
或正确函数的结果(在我的示例中为 String
或 Optional.empty
)。如果您尝试 return(在 GenericType
和 DomainError
之间)有一个共同的超类型,您可以选择这个作为函数的 return 类型而不是Object
.
我有一个 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>
或正确函数的结果(在我的示例中为 String
或 Optional.empty
)。如果您尝试 return(在 GenericType
和 DomainError
之间)有一个共同的超类型,您可以选择这个作为函数的 return 类型而不是Object
.