Kotlin 如何使用combinator函数压缩8个以上的mono

Kotlin 如何使用combinator函数压缩8个以上的mono,kotlin,project-reactor,spring-webclient,Kotlin,Project Reactor,Spring Webclient,我通过调用多个web服务来丰富数据,这些服务针对以前的web服务调用(即扇出)返回的每个项目 我正在使用Kotlin、Spring Boot 2和新的反应式网络客户端 在这段代码片段中,我只展示了分散到Web服务的代码,但实际上这是在一个更大管道的末尾 之前我一直在使用Mono.zip(t1、t2、t3)接口,该接口支持最多传递8个值,并返回具有正确类型的元组 定义: publicstaticmono-zip(Mono…monos){ 如果(monos.length==0){ 返回空(); }

我通过调用多个web服务来丰富数据,这些服务针对以前的web服务调用(即扇出)返回的每个项目

我正在使用Kotlin、Spring Boot 2和新的反应式网络客户端

在这段代码片段中,我只展示了分散到Web服务的代码,但实际上这是在一个更大管道的末尾

之前我一直在使用Mono.zip(t1、t2、t3)接口,该接口支持最多传递8个值,并返回具有正确类型的元组

定义:

publicstaticmono-zip(Mono…monos){
如果(monos.length==0){
返回空();
}
if(monos.length==1){
返回monos[0].map(d->combinator.apply(新对象[]{d}));
}
在组装时返回(新的MonoZip(false、combinator、monos));
}
我在使用KOTLIN时遇到的问题我在调用站点定义combinator函数时遇到困难。以下是我到目前为止的情况:

val tst: (Array<Any>) -> Mono<AggregateReport> = { it -> Mono.just(AggregateReport("Test")) }


val res = Mono.zip(
        tst,
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono()
)
valtst:(数组)->Mono={it->Mono.just(AggregateReport(“Test”)}
val res=Mono.zip(
tst,
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono()的
)
显然,我需要增强combinator以实际处理输入数组并生成聚合。但是,代码当前未编译

编译错误:

Error:(339, 41) Kotlin: Type mismatch: inferred type is (Array<Any>) -> Mono<ConsoleApplication.AggregateReport> but Function<in Array<(out) Any!>!, out (???..???)> was expected
错误:(339,41)Kotlin:类型不匹配:推断的类型为(数组)->Mono,但应为函数
有什么建议吗


谢谢

在纯科特林,你不能这样做

您在问题描述中提供的方法
zip
的签名需要
函数
类型,即java类型

这(科特林一号):

val-kotlin:(List)->String={array:List->“kotlin”}
不等同于(java):

Function java=array->“java”

您可以执行以下操作:

import reactor.core.publisher.Mono
import java.util.function.Function

...

fun main() {
    val tst = Function<Array<Any>, Mono<AggregateReport>> { Mono.just(AggregateReport("Test")) }

    Mono.zip(
        tst,
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono()
    )
}
导入reactor.core.publisher.Mono
导入java.util.function.function
...
主要内容(){
val tst=函数{Mono.just(AggregateReport(“Test”)}
Mono.zip(
tst,
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono(),
Client.callThatReturnsAMono()的
)
}

您必须实际使用
java.util.function.function
类型,但Kotlin有助于使外观更美观

经过一些额外的研究,我发现Reactor有Kotlin扩展,它提供了一个zip函数,该函数具有更好的方法签名,用于组合N个monos

IE-
fun-zip(vararg-monos:Mono,combinator:(数组)->R):Mono

通过这种方式,我能够提供一个期望数组并返回Mono的组合器。我实现了一个通用的组合器,它可以检查传入响应的类型,并将类型断言指向聚合的各种属性的正确子类


这8个以上的回答是什么类型的?此请求是否返回相同的数据类型?你期望的最终输出类型是什么?我的答案不适合你?你能检查一下吗?:)我有8种类型,它们都扩展了
Report
。我想要的结果是一个
聚合报表
。combinator对不同的报告执行类型断言以生成聚合,在pure Kotlin中,这甚至不是编译。同意-在我的pure Kotlin项目中。没有编译。所以您不能在项目中使用
java.util.function.function
    Function<List<String>, String> java = array -> "java"
import reactor.core.publisher.Mono
import java.util.function.Function

...

fun main() {
    val tst = Function<Array<Any>, Mono<AggregateReport>> { Mono.just(AggregateReport("Test")) }

    Mono.zip(
        tst,
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono(),
        Client.callThatReturnsAMono()
    )
}