Java 折叠其中一个以返回不同的值
我有一个Vavr,看起来像这样: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
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());
}