如何将 List<Mono<T>> 转换为 Mono<List<T>>?
How to convert List<Mono<T>> to Mono<List<T>>?
我有一个方法 returns Mono<Output>
:
interface Processor {
Mono<Output> process(Input input);
}
我想为一个集合执行这个processor
方法:
List<Input> inputs = // get inputs
Processor processor = // get processor
List<Mono<Output>> outputs = inputs.stream().map(supplier::supply).collect(toList());
但是我想要 Mono<List<Output>>
而不是 List<Mono<Output>>
,它将包含聚合结果。
我尝试了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;
})));
我可以用更少的代码实现这个吗?
// 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,映射它并收集列表
Flux.fromIterable(inputs).flatMap(processor::process).collectList();
我有一个方法 returns Mono<Output>
:
interface Processor {
Mono<Output> process(Input input);
}
我想为一个集合执行这个processor
方法:
List<Input> inputs = // get inputs
Processor processor = // get processor
List<Mono<Output>> outputs = inputs.stream().map(supplier::supply).collect(toList());
但是我想要 Mono<List<Output>>
而不是 List<Mono<Output>>
,它将包含聚合结果。
我尝试了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;
})));
我可以用更少的代码实现这个吗?
// 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,映射它并收集列表
Flux.fromIterable(inputs).flatMap(processor::process).collectList();