kotlin - 如何使用组合函数压缩超过 8 个单声道
问题描述
我通过为作为先前 Web 服务调用的结果返回的每个项目调用多个 Web 服务来丰富数据(即 - 扇出)。
我正在使用 Kotlin、Spring Boot 2 和新的响应式 WebClient。
在这个片段中,我只展示了散播到 web 服务的代码,但实际上这是一个更大管道的末端。
以前我一直在使用 Mono.zip(t1, t2, t3) 接口,它支持最多传递 8 个值并返回具有正确类型的元组。
定义:
public static <T1, T2, T3, T4, T5, T6, T7, T8> Mono<Tuple8<T1, T2, T3, T4, T5, T6, T7, T8>> zip(Mono<? extends T1> p1,
Mono<? extends T2> p2,
Mono<? extends T3> p3,
Mono<? extends T4> p4,
Mono<? extends T5> p5,
Mono<? extends T6> p6,
Mono<? extends T7> p7,
Mono<? extends T8> p8) {
return onAssembly(new MonoZip(false, a -> Tuples.fromArray((Object[])a), p1, p2, p3, p4, p5, p6, p7, p8));
}
我现在有超过 8 个服务要调用,所以我正在研究 Mono.zip(combinatorFn, ... monos) 组合调用结果的方法。
定义:
public static <R> Mono<R> zip(Function<? super Object[], ? extends R> combinator, Mono<?>... monos) {
if (monos.length == 0) {
return empty();
}
if (monos.length == 1) {
return monos[0].map(d -> combinator.apply(new Object[]{d}));
}
return onAssembly(new MonoZip<>(false, combinator, monos));
}
我在使用KOTLIN时遇到的问题我很难在调用站点定义组合器函数。这是我到目前为止所拥有的:
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()
)
显然,我需要增强组合器以实际使用输入数组并生成聚合。但是,该代码当前无法编译。
编译错误:
Error:(339, 41) Kotlin: Type mismatch: inferred type is (Array<Any>) -> Mono<ConsoleApplication.AggregateReport> but Function<in Array<(out) Any!>!, out (???..???)> was expected
有什么建议么?
谢谢!
解决方案
经过一些额外的研究后,我发现 Kotlin Extensions for Reactor 提供了一个 zip 函数和一个更好的方法签名来组合 N 个单声道。
IE -fun <R> zip(vararg monos: Mono<*>, combinator: (Array<*>) -> R): Mono<R>
通过这种方式,我能够提供一个期望一个数组并返回一个 Mono 的组合器。我实现了一个通用组合器,它可以检查传入响应的类型,并将断言类型为我的聚合的各种属性的正确子类。
推荐阅读
- python - 如果另一列的值相同,则添加熊猫数据框列的值
- python - 如何从此字符串中提取当前月份?
- c - 为什么使用 arcsin 的泰勒级数公式在 x = 1 时收敛得如此之快
- beautifulsoup - 比较容器标签的“类”
- apache-spark - 如何在不使用 HDP 3.1 中的仓库连接器的情况下将表从 spark 中写入 hive
- php - 1到n个数字组合的概率
- android - 如何取消报警管理器每日通知?
- kubernetes - 如何编写 kubernetes 部署以获取使用 GCP cloudbuild 构建的最新镜像
- mongodb - 如何使用 Map 动态生成的键查询集合中的所有文档?
- ios - Xcode 11 在捆绑包 NSBundle 中找不到名为“Main”的情节提要