【问题标题】:Spring Boot (v2.3.1): Webflux Mono Zip list of MonosSpring Boot (v2.3.1):Webflux Mono Zip 列表 Monos
【发布时间】:2021-01-20 10:00:56
【问题描述】:

我正在尝试弄清楚如何使用 .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));
}

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

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

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

List<Mono> monos = new ArrayList();

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

我收到一个错误:List&lt;Mono&gt; is not compatible with Iterable&lt;? extends Mono&lt;?&gt;&gt;

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

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

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

    1. 在下面的签名中,第一个参数必须是 Iterable&lt;? extends Mono&lt;?&gt;&gt; monos 类型,这意味着您的第一个参数 (monos) 必须是通用类型 Mono>,例如 Mono。
    2. 第二个参数必须是对象数组,即Object[]。所以作为 lambda 表达式参数的 (a, b, c) 无效。
    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())
            );
    

    【讨论】:

      猜你喜欢
      • 2023-02-13
      • 2020-03-18
      • 2018-12-12
      • 2021-11-18
      • 2019-11-11
      • 2019-05-18
      • 2020-05-18
      • 2021-11-09
      • 2021-09-30
      相关资源
      最近更新 更多