将多个响应式请求连接到一个 Mono

Concat multiple reactive requests to one Mono

我注意到反应库中有元组,但是如果元组超过 8 个怎么办?

https://projectreactor.io/docs/core/release/api/reactor/util/function/Tuples.html#fromArray-java.lang.Object:A-

示例代码似乎有效,但是否有更好的方法来使用某种收集器?

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.