Concat несколько реактивных запросов к одному Mono - PullRequest
0 голосов
/ 02 мая 2018

Я заметил, что в реактивных библиотеках есть кортежи, но что мне делать, если существует более 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? (не смотрел вокруг на документацию почему, но не мое главное беспокойство)

Спасибо

1 Ответ

0 голосов
/ 02 мая 2018

zip (в котором используется TupleN) - для случаев, когда вы хотите создать значения путем компоновки из комбинации источников. Например. из Flux<FirstName> и Flux<LastName> вы хотите Flux<FullName>, который испускает одну FullName для каждой входящей пары FistName / LastName.

Для вашего случая использования, когда вы хотите выполнить несколько вызовов (возможно, параллельно) и собрать результаты в список, 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 - это неизменяемая структура данных фиксированного размера, используемая zip для удобства, когда вы не хотите создавать выделенный POJO. Нет смысла пытаться поддерживать неограниченные размеры, поэтому мы остановились на восьми. Существует вариант zip, который объединит более 8 источников, но заставит вас работать с Object[] вместо Tuple.

...