当前位置: 首页 > 知识库问答 >
问题:

返回Vavr的链接函数

双俊人
2023-03-14

我有一系列函数,它们接收请求对象并返回Vavr。

如果任务已完成,则要么将包含一个Result对象,如果任务需要由另一个函数完成,则将包含一个修改后的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);

但是很明显faceMap↓不是一个东西,所以我最终在左侧有一个嵌套的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

共有2个答案

温开畅
2023-03-14
Result result = function1.apply(request)
            .fold(function2, Either::<Request, Result>right)
            .fold(function3, Either::<Request, Result>right)
            .fold(terminalFunction, r->r);

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

白和泽
2023-03-14

您的请求侧需要一元合成,这是您的类型签名的左侧,但您的右侧有一元合成。因此,您需要在函数定义中交换eithers,或者您必须通过传递它们。swap()

Function1.of(SomeType::function1).andThen(Either::swap)

本质上,您的每个函数[1-3]都会变成类型:

Function<Request, Either<Result, Request>>

然后您的呼叫链变成:

Result result = function1.apply(request)
        .flatMap(function2)
        .flatMap(function3)
        .swap()
        .getOrElseGet(terminalFunction);
 类似资料:
  • 我有方法: 我想返回列表和HTTP状态或TaskError。TASKS\u LIST\u NOT\u FOUND和HTTP状态,但由于两者之一,Json中还有其他内容,如“right”等。 解决方案(感谢@chrylis-谨慎光学)

  • 问题内容: 我已经使用延迟模块在Node.js中创建了我的第一个延迟对象,当我将结果传递给下一个函数并触发解析和拒绝时,它的效果很好。当每个函数返回deferred.promise时如何链式执行函数数组?我有函数的输入参数数组和第一个函数的输入参数,每个下一个函数都从上一个获取参数。 它的工作方式类似于,但是当我有n个函数时该如何工作。 问题答案: 您需要在循环中构建一个Promise链:

  • 我有一个函数,当某些条件不满足时,它应该不返回任何内容(void)或字符串。 我也试过这句话。左(无效)

  • 问题内容: 我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回 给客户端 现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但是游标名称是由PostgreSQL自动生成的 此外,如38.7.3.5中所述,显式地将游标名称声明为函数的输入参数 。返回游标。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标,而不是为我自动生成的Postgresql吗?如果不是

  • 问题内容: 我想编写一个脚本来测试所有链接的服务器,并返回唯一已连接的服务器(可以肯定只有一个)。 这是我当前的脚本,但是我被困在这一点上: 但是使用此查询,代码无法在第一次迭代时停止,因为它无法连接到表的第一台服务器。这是错误消息: 链接服务器“ server1”的OLE DB提供程序“ MSDASQL”返回了消息“通信链接失败; -10709连接失败(连接超时已过期)”。消息7303,级别16

  • 函数作为返回值 高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。 我们来实现一个可变参数的求和。通常情况下,求和的函数是这样定义的: def calc_sum(*args): ax = 0 for n in args: ax = ax + n return ax 但是,如果不需要立刻求和,而是在后面的代码中,根据需要再计算怎么办?可以不返回