如何转换List< Mono<>>到Mono< List< T>&gt ;? [英] How to convert List<Mono<T>> to Mono<List<T>>?

查看:114
本文介绍了如何转换List< Mono<>>到Mono< List< T>&gt ;?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个返回 Mono< Output> 的方法:

interface Processor {
  Mono<Output> process(Input input);
}

我想为集合执行此 processor 方法:

And I want to execute this processor method for a collection:

List<Input> inputs = // get inputs
Processor processor = // get processor
List<Mono<Output>> outputs = inputs.stream().map(supplier::supply).collect(toList());

但我想获取的 Mono< List< List< Output>> 而不是 List< Mono< Output>>

我尝试了 reduce ,但是最终结果看起来很笨拙:

I tried reduce, but the final result looks very clumsy:

Mono<List<Output>> result = inputs.stream().map(processor::process)
    .reduce(Mono.just(new ArrayList<>()),
        (monoListOfOutput, monoOfOutput) ->
            monoListOfOutput.flatMap(list -> monoOfOutput.map(output -> {
              list.add(output);
              return list;
            })),
        (left, right) ->
            left.flatMap(leftList -> right.map(rightList -> {
              leftList.addAll(rightList);
              return leftList;
            })));

我可以用更少的代码来实现吗?

Can I achieve this with less code?

推荐答案

如果您不必出于任何原因创建流,则可以从输入中创建Flux,对其进行映射并收集列表

If you don't have to create stream for any reason, you could create Flux from your inputs, map it and collect list

Flux.fromIterable(inputs).flatMap(processor::process).collectList();

这篇关于如何转换List&lt; Mono&lt;&gt;&gt;到Mono&lt; List&lt; T&gt;&gt ;?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆