В чем разница между map и doOnNext в потоке? (т.е. проектный реактор) - PullRequest
0 голосов
/ 06 февраля 2020

В карте потока также выполняется функция для каждого элемента в потоке. Для doOnNext функция также выполняется для каждого элемента (испускаемого) в потоке. В чем разница с точки зрения пользователя? почему существует два похожих метода? Мог бы объяснить с простотой использования.

1 Ответ

0 голосов
/ 07 февраля 2020

TLDR; Flux#doOnNext для побочных эффектов, Flux#map для синхронного отображения чего-то из одного типа в другой.

Если мы посмотрим на документацию , то для doOnNext будет сказано следующее

Flux<T> doOnNext(Consumer<? super T> onNext)
Add behavior (side-effect) triggered when the Flux emits an item.

это означает, что в doOnNext мы можем создавать побочные эффекты, такие как log, или делать где-нибудь еще вызов и т. Д. c. и др c. Мы также возвращаем Flux типа T, то есть тот же, что принимает doOnNext, поэтому никаких изменений типа.

Если мы, с другой стороны, посмотрим на Map:

Flux<V> map(Function<? super T,? extends V> mapper)
Transform the items emitted by this Flux by applying a synchronous function to 
each item.

Мы можем прочитать, что здесь мы можем применить синхронную функцию, в основном, мы можем сделать что-то с нашим выдаваемым значением. Добавьте что-то, вычтите что-нибудь, измените это каким-то образом, здесь мы можем преобразовать это, например, map это во что-то другое.

Если мы посмотрим на типы в map, мы увидим, что map испустит что-то super T, но вернет что-то такое, что extends V

Это типичный шаблон java генериков, и если вы хотите sh узнать больше об этом, я рекомендую вам посмотреть Джошуа Блохс говорит о дженериках . Все видео - хорошие часы и объяснит это намного лучше, чем я.

Но я хочу отметить, что при использовании карты вы возвращаете другой тип . Вы получаете что-то, что super T из потока, затем вы отображаете это на что-то еще, что extends V.

...