将多个响应式请求连接到一个 Mono
Concat multiple reactive requests to one Mono
我注意到反应库中有元组,但是如果元组超过 8 个怎么办?
示例代码似乎有效,但是否有更好的方法来使用某种收集器?
private Mono<List<String>> getContent(List<String> ids) {
List<String> allContent = new ArrayList<>();
Mono<List<String>> allContentMono = Mono.empty();
for(String id : ids) {
allContentMono = callApi(id)
.flatMap(result -> result.bodyToMono(String.class))
.map(str -> {
allContent.add(str);
return allContent;
});
}
return allContentMono;
}
为什么元组大小停在了 8? (没有四处寻找有关原因的文档,但不是我主要关心的问题)
谢谢
zip
(使用 TupleN
)用于当您想要通过组合从源组合中创建值时。例如。在 Flux<FirstName>
和 Flux<LastName>
中,你想要一个 Flux<FullName>
,它为每个传入的 FistName
/LastName
对发出一个 FullName
。
对于您想要执行多个调用(可能并行)并将结果收集到列表中的用例,flatMap
就足够了:
private Mono<List<String>> getContent(List<String> ids) {
return Flux
.fromIterable(ids)
.flatMap(id -> callApi(id))
.flatMap(response -> response.bodyToMono(String.class))
.collectList();
}
Tuple
是一个不可变的、固定大小的数据结构,当您不想创建专用的 POJO 时,zip
使用它作为方便。尝试支持无限大小是没有意义的,所以我们停在了 8 个。有一个 zip
变体将聚合超过 8 个来源,但会让您使用 Object[]
而不是 Tuple
.
我注意到反应库中有元组,但是如果元组超过 8 个怎么办?
示例代码似乎有效,但是否有更好的方法来使用某种收集器?
private Mono<List<String>> getContent(List<String> ids) {
List<String> allContent = new ArrayList<>();
Mono<List<String>> allContentMono = Mono.empty();
for(String id : ids) {
allContentMono = callApi(id)
.flatMap(result -> result.bodyToMono(String.class))
.map(str -> {
allContent.add(str);
return allContent;
});
}
return allContentMono;
}
为什么元组大小停在了 8? (没有四处寻找有关原因的文档,但不是我主要关心的问题)
谢谢
zip
(使用 TupleN
)用于当您想要通过组合从源组合中创建值时。例如。在 Flux<FirstName>
和 Flux<LastName>
中,你想要一个 Flux<FullName>
,它为每个传入的 FistName
/LastName
对发出一个 FullName
。
对于您想要执行多个调用(可能并行)并将结果收集到列表中的用例,flatMap
就足够了:
private Mono<List<String>> getContent(List<String> ids) {
return Flux
.fromIterable(ids)
.flatMap(id -> callApi(id))
.flatMap(response -> response.bodyToMono(String.class))
.collectList();
}
Tuple
是一个不可变的、固定大小的数据结构,当您不想创建专用的 POJO 时,zip
使用它作为方便。尝试支持无限大小是没有意义的,所以我们停在了 8 个。有一个 zip
变体将聚合超过 8 个来源,但会让您使用 Object[]
而不是 Tuple
.