зачем вам flatMap.
Это мои идеи, ответ варьируется в зависимости от того, работает ли он на Mono или Flux.
1.
javado c карты методов и flatMap показывает их использование:
map: Преобразуйте элемент, испускаемый этим {@link Mono}, применяя к нему синхронную функцию.
flatMap: преобразует элемент, испускаемый этим {@link Mono}, асинхронно, возвращая значение, испускаемое другим {@link Mono} (возможно, изменяя тип значения).
То говорит, что, рассматривая flatMap
и map
как конвейер с вводом и выводом, вы используете map
, когда вывод - тот же элемент, в противном случае используйте flatMap
. Проверьте это:
public Mono<ServerResponse> influCRUD(ServerRequest req) {
return req.bodyToMono(S.class) // the pipline begins with S class.
.map(s -> {s.setF1(f1); s.setF2(f2); return s;}) // the pipeline has the same intput and output, i.e. object s, you use map.
.flatMap(s -> webClient // the pipeline has S input, and T output, you use flatMap
.post()
.uri(uri)
.body(BodyInserters.fromObject(s))
.retrive()
.bodyToMono(T.class)
).flatMap(t -> ServerResponse // now the pipeline changes again, you use flatMap.
.ok()
.contentType()
.body(BodyInserters.fromObject(t))
);
}
стоит упомянуть, что map
может иметь другой объект в качестве вывода.
flatMap обрабатывает все элементы
указанная выше причина полезна для Mono
производителя. Для Flux
, flatMap
обрабатывает все элементы, а map
обрабатывает все элементы (или один элемент). это то же самое, что и в лямбде. Если вы хотите обработать каждый элемент, вы используете flatMap
.
flatMap снимает один слой моно для вас.
Посмотрите на их объявление:
<R> Mono<R> map(Function<? super T, ? extends R> mapper)
и
<R> Mono<R> flatMap(Function<? super T, ? extends Mono<? extends R>> transformer)
Function
ничего не делает но a -> b
, когда b
является выходом другого Producer/Subsciber
(это очень вероятно, если вы используете реактивное программирование), например, часть webClient
в предыдущем примере, она имеет форму Mono или Flux. Используя flatMap, он возвращает Mono<R>
для вас, где map возвращает Mono<Mono<R>>
, как они указаны в объявлении функции.
Я тоже новичок в reative программировании, более чем приветствую исправьте это .