Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何转换列表<;单声道<;T>&燃气轮机;到Mono<;列表<;T>>;?_Java_Project Reactor_Reactor - Fatal编程技术网

Java 如何转换列表<;单声道<;T>&燃气轮机;到Mono<;列表<;T>>;?

Java 如何转换列表<;单声道<;T>&燃气轮机;到Mono<;列表<;T>>;?,java,project-reactor,reactor,Java,Project Reactor,Reactor,我有一个方法返回Mono: 但是我想得到包含聚合结果的Mono,而不是列表 我尝试了reduce,但最终结果看起来非常笨拙: Mono<List<Output>> result = inputs.stream().map(processor::process) .reduce(Mono.just(new ArrayList<>()), (monoListOfOutput, monoOfOutput) ->

我有一个方法返回
Mono

但是我想得到包含聚合结果的
Mono
,而不是
列表

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

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;
            })));
Mono result=inputs.stream().map(处理器::进程)
.reduce(Mono.just(new ArrayList()),
(单输出、单输出)->
monoListOfOutput.flatMap(列表->monoOfOutput.map(输出->{
列表。添加(输出);
退货清单;
})),
(左,右)->
left.flatMap(leftList->right.map(righlist->{
addAll(rightList);
返回左列表;
})));

我能用更少的代码实现这一点吗?

如果您不必出于任何原因创建流,您可以从输入中创建流量,映射它并收集列表

// first merge all the `Mono`s:
List<Mono<Output>> outputs = ...
Flux<Output> merged = Flux.empty();
for (Mono<Output> out : outputs) {
    merged = merged.mergeWith(out);
}

// then collect them
return merged.collectList();
Flux.fromIterable(inputs).flatMap(processor::process).collectList();

您只需使用Mono.just并使用map(Mono::block())@manf将调用包装为“collect(toList)”,然后我将获得
Mono
。我只需要
Mono
。添加了我已经尝试过的方法。@manf我不想阻止。即使从
输出开始,而不是从
输入开始,也可以使用相同的方法(编辑了我的答案)。但这更好。
// first merge all the `Mono`s:
List<Mono<Output>> outputs = ...
Flux<Output> merged = Flux.empty();
for (Mono<Output> out : outputs) {
    merged = merged.mergeWith(out);
}

// then collect them
return merged.collectList();
Flux.fromIterable(outputs).flatMap(x -> x).collectList();
Flux.fromIterable(inputs).flatMap(processor::process).collectList();