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();