链接函数 return Vavr Either

Chaining functions that return Vavr Either

我有一系列函数接收 Request 对象和 return Vavr Either。

如果任务完成,则 Either 将包含一个 Result 对象;如果任务需要由另一个函数完成,则 Either 将包含一个修改后的 Request 对象。

当时的想法是,我可以通过执行以下操作将它们链接在一起:

// Note: The Request object parameter is modified by the function 
// before being returned in the Either.
Function<Request, Either<Request,Result>> function1;
Function<Request, Either<Request,Result>> function2;
Function<Request, Either<Request,Result>> function3;
Function<Request, Result> terminalFunction;

Result result = function1.apply(request)
            .flatMapLeft(function2)
            .flatMapLeft(function3)
            .fold(terminalFunction, r->r);

但显然 flatMapLeft 不是一个东西,所以我最后在左侧有一个嵌套的 Eithers。关于如何实现此功能的任何想法?我对其他图书馆持开放态度。

编辑:

Result result = function1.apply(request)
            .fold(function2, Either::right)
            .fold(function3, Either::right)
            .fold(terminalFunction, r->r);

似乎这样应该可以代替,但 Intellij 在第二个折叠行给出了这个错误:

no instance(s) of type variable(s) exist so that capture of ? extends Object conforms to Request
Result result = function1.apply(request)
            .fold(function2, Either::<Request, Result>right)
            .fold(function3, Either::<Request, Result>right)
            .fold(terminalFunction, r->r);

这似乎有效,尽管它有点笨拙。这是对图书馆的滥用吗?有兴趣听听一些替代方法。

您的 Request 侧需要单子组合,它在您的类型签名的左侧,但您在右侧有 Either 的单子组合。所以你需要在你的函数定义中交换你的任一个,或者你必须通过 Either.swap()

传递它们
Function1.of(SomeType::function1).andThen(Either::swap)

基本上,您的每个 function[1-3] 都会变成以下类型:

Function<Request, Either<Result, Request>>

那么你的调用链就变成了:

Result result = function1.apply(request)
        .flatMap(function2)
        .flatMap(function3)
        .swap()
        .getOrElseGet(terminalFunction);