链接函数 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);
我有一系列函数接收 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);