Programowanie reaktywne – operacje przekształcające map, flatMap, filter oraz zip

28-10-2021

Kontynuujemy cykl, którego głównym bohaterem jest programowanie reaktywne. Dla naszych dalszych rozważań ważnym będzie powtórzenie pewnych związanych z nim prawidłowości

Jak już wiemy programowanie reaktywne (Reactive Programming) zbudowane jest wokół przetwarzania strumieniowego. Dane są obsługiwane jako strumień punktów danych przechodzących przez potok funkcji lub operatorów. Każdy operator może przekształcać i manipulować danymi, zanim zostaną one przekazane do następnego operatora. 

Przekształcanie strumieni

Operatorami mogą być mapa, kolekcja, ale i inne elementy. Operacje te są łańcuchowo wykonywane do momentu zwrócenia przekształconych danych. 

Oczywistym jest, że napisanie programu, który będzie działał i będzie użyteczny, wymaga od nas umiejętności pracy z reaktywnymi strumieniami. Ta praca z kolei nie będzie efektywna, wręcz niemożliwa  jeżeli nie będziemy potrafili ani tworzyć, ani przekształcać strumieni. Dzisiaj właśnie o najczęstszych metodach ich tworzenia i przekształcania. 

Flux<T>.map()

map programowanie reaktywne

Mapa tutaj jest taka sama jak mapa strumienia java 8, używana do konwersji elementów.

Służy do synchronicznych, nieblokujących przekształceń 1-do-1

Na przykład, jeśli masz listę String i chcesz przekonwertować je wszystkie na wielkie litery, jak to zrobisz? Trzeba było przejść przez Listę za pomocą pętli for lub foreach i przekształć każdy element.

Używając funkcji map() , możesz zastosować dowolną funkcję do każdego elementu. Może to być dowolna funkcja predefiniowana lub funkcja zdefiniowana przez użytkownika. Można używać nie tylko wyrażenia lambda, ale także odwołań do metod .

Jednym z przykładów jest konwersja listy liczb całkowitych, a następnie kwadratu każdej liczby. Funkcja map jest również operacją pośrednią i zwraca strumień transformowanego elementu.

Flux<T>.flat 

flat programowanie reaktywne class=

Flatmap to także konwersja elementów, ale różnica polega na tym, że flatmap konwertuje elementy na strumienie, a następnie łączy strumienie w jeden duży strumień.

Dotyczy asynchronicznych (nieblokujących) przekształceń 1-do-N

Dla każdego <T>elementu wejściowego flatMap mapuje go do Publisher<V>.  Ogólny przypadek jest taki, że a Publisher może emitować wiele elementów.

Metoda flatMap jest podobna do metody map z kluczową różnicą, że dostawca, którego jej dostarczysz, powinien zwrócić a Mono<T>lub Flux<T>.

Flux<T>.filter()

filter

Filtr reaktora jest taki sam jak filtr strumienia java 8.

Przechodzi przez wszystkie obecne elementy i usuwa lub odfiltrowuje wszystkie te elementy, które nie pasują do określonego warunku za pomocą znaczącego argumentu. Jest to w zasadzie operacja, która odbywa się pomiędzy interfejsem strumienia. Funkcja zwraca strumień wyjściowy zawierający elementy strumienia wejściowego pasujące do podanych warunków.

Flux<T>.zip()

zip programowanie reaktywne

Ta operacja może wydawać się nieznana. Jak sama nazwa wskazuje, „kompresja” polega na łączeniu wielu strumieni jeden do jednego.

Istnieje jeszcze inny powód, ponieważ w każdym strumieniu flux lub strumieniu mono prędkość każdego strumienia jest inna. Funkcja zip służy także do synchronizacji dwóch strumieni. Na przykład dodajemy tutaj kolejny strumień. Ten strumień będzie stale emitował elementy. Prędkość drugiego strumienia jest ograniczona do emitowania jednego elementu co sekundę, dzięki czemu połączony strumień również zostanie wysłany do drugiego. W efekcie powstaje wyrównanie strumienia.