Java 8 将不同结果类型的多个“Try”实例组合为应用程序

Java 8 将不同结果类型的多个“Try”实例组合为应用程序,java-8,functional-programming,vavr,Java 8,Functional Programming,Vavr,在Vavr中是否有一个用于组合Try实例的api,它类似于Scalaz应用程序操作符@的工作方式 具体来说,如果我有两个以上的Try实例,例如Try、Try和Try,我希望使用3-arg函数以应用方式组合这些实例 我正在寻找一个类似于以下内容的函数签名: static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> fu

在Vavr中是否有一个用于组合
Try
实例的api,它类似于Scalaz应用程序操作符
@
的工作方式

具体来说,如果我有两个以上的
Try
实例,例如
Try
Try
Try
,我希望使用3-arg函数以应用方式组合这些实例

我正在寻找一个类似于以下内容的函数签名:

static <X, Y, Z, R> Try<R> combine(Try<X> x, Try<Y> y, Try<Z> z, Function3<X,Y,Z,R> func
静态尝试组合(尝试x、尝试y、尝试z、函数3 func

据我所知,它不直接支持这种用法。但是,您可以使用flatMap实现它:

static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
    return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
如果您比较输入和输出类型,您可以看到这实际上交换了
Try
List
容器的位置。这对于monad来说非常习惯,尽管通常您会使用应用程序映射操作而不是flatMap来实现它


或者,使用,其设计用于应用程序样式(通过
验证。组合
)。

据我所知,它不直接支持该用法。但是,您可以使用flatMap实现:

static <X, Y, Z, R> Try<R> combine(Try<X> tx, Try<Y> ty, Try<Z> tz, Function3<X,Y,Z,R> func) {
    return tx.flatMap(x -> ty.flatMap(y -> tz.map(z -> func.apply(x, y, z))));
}
如果您比较输入和输出类型,您可以看到这实际上交换了
Try
List
容器的位置。这对于monad来说非常习惯,尽管通常您会使用应用程序映射操作而不是flatMap来实现它


或者,使用,其设计用于应用程序风格(通过
验证。组合
)。

是的,尽管对于超过3个
Try
实例,那些嵌套的
flatMap
调用可能会有点麻烦!我可以使用
验证
,但它似乎不适合我的用例(除支持的应用程序语法外)。谢谢。或者我可以写一个方便的方法,完全按照你的建议:thinking face:@divelhpremdeep我已经编辑了答案,提供了另一种选择-
序列
。是的,虽然对于3个以上的
Try
实例,那些嵌套的
平面图
调用可能会有点麻烦!我可以使用
验证,但它似乎不太适合我的用例(除了它支持的应用程序语法)。谢谢。或者我可以编写一个方便的方法,完全按照您的建议执行:thinking face:@divelhpremdeep我编辑了答案,以提供另一种选择-
序列