首页 > 解决方案 > Spring Boot (v2.3.1):Webflux Mono Zip 列表 Monos

问题描述

我想弄清楚如何使用.zip的这个签名

public static <R> Mono<R> zip(final Iterable<? extends Mono<?>> monos, Function<? super Object[], ? extends R> combinator) {
    return onAssembly(new MonoZip<>(false, combinator, monos));
}

我有多个从 webclient 请求创建的单声道,我想压缩它们。像这样单独提供每个单声道有效:

Mono.zip(m1, m2, m3, (a, b, c) -> {  })

但是如果一个单声道列表像

List<Mono> monos = new ArrayList();

Mono.zip(monos, () -> {});

我收到一个错误:List<Mono> is not compatible with Iterable<? extends Mono<?>>

以这种方式尝试使用 .zip 是否合适,如果是,我该如何实现。

标签: spring-bootspring-webflux

解决方案


我可以看到这里有两件事:

  1. 在下面的签名中,第一个参数必须是类型,Iterable<? extends Mono<?>> monos这意味着您的第一个参数 ( monos) 必须是通用类型 Mono<?>,例如 Mono。
  2. 第二个参数必须是对象数组,即Object[]。所以 (a, b, c) 作为 lambda 表达式参数是无效的。
public static <R> Mono<R> zip(final Iterable<? extends Mono<?>> monos, Function<? super Object[], ? extends R> combinator) {
    return onAssembly(new MonoZip<>(false, combinator, monos));
}

正确使用上述方法将如下所示:

List<Mono<YourObject>> monos = new ArrayList<>();
        Mono.zip(monos, objectArray ->
                Arrays.stream(objectArray)
                        .map(object -> yourMapperFunction(object))
                        .collect(Collectors.toList())
        );

推荐阅读