Spring webflux Когда использовать карту поверх плоской карты - PullRequest
0 голосов
/ 17 апреля 2020

Я новичок в java реактивном программировании, и я начал изучать его с весны webflux. Одна вещь, которая всегда беспокоит меня, что карта является синхронной, в то время как flatmap является асинхронной.

Я изучаю это из весенней книги в главе действия 10, и я вижу пример ниже.

Flux<Player> playerFlux = Flux
.just("Michael Jordan", "Scottie Pippen", "Steve Kerr")
.map(n -> {
String[] split = n.split("\\s");
return new Player(split[0], split[1]);
});

и после следующей строки написано

What’s important to understand about map() is that the mapping is performed synchronously, as each item is published by the source Flux. If you want to perform the mapping asynchronously, you should consider the flatMap() operation.

и показан этот пример

Flux<Player> playerFlux = Flux
.just("Michael Jordan", "Scottie Pippen", "Steve Kerr")
.flatMap(n -> Mono.just(n)
.map(p -> {
String[] split = p.split("\\s");
return new Player(split[0], split[1]);
})
.subscribeOn(Schedulers.parallel())
);

Хорошо, я думаю, что понял, но когда я тренировался, я думаю, что на самом деле Я не получил это. у меня возникло много вопросов, когда я пытался заполнить поля своего класса.

@Data
@Accessors(chain = true)
public class Response {

    private boolean success;
    private String message;
    private List data;
}

Вот код, как я пытался заполнить его

Mono<Response> response = Mono.just(new Response())
.map(res -> res.setSuccess(true))
.map(res -> res.setMessage("Success"))
.map(res -> res.setData(new ArrayList()));

после написания этот код, одна строчка из книги мигает в моей голове, которая отображает его синхронность, будет ли он блокирующим кодом, может ли он быть плохим для всего приложения, потому что, как только я прочту это, в неблокирующем приложении один блокирующий код может испортить все приложение.

Итак, я решил преобразовать его в плоскую карту, и в соответствии с книгой он должен выглядеть следующим образом.

Mono<Response> response1 = Mono.just(new Response())
    .flatMap(
            m -> Mono.just(m)
            .map(res -> res.setSuccess(true))
    )
    .flatMap(
            m -> Mono.just(m)
            .map(res -> res.setMessage("Success"))
    )
    .flatMap(
            m -> Mono.just(m)
            .map(res -> res.setData(new ArrayList()))
    );

Оба примера выводятся одинаково, но тогда какая здесь разница. так что мы всегда должны использовать flatmap?

Спасибо

...