Programarea reactiva Java. Implementarea si abonarea la un observer

Continuam seria noastra de articole despre programarea reactiva in Java. De aceasta data ne uitam la implementarea si abonarea la un observer.

Implementarea si abonarea la un observer

In Java 9, nu exista implementarea unor fluxuri reactive ci doar o specificatie. Insa, sunt mai multe librarii — implementari ale abordarii reactive. In acest exemplu, folosim libraria RxJava. Ne abonam la un flux de date si definim mai multi handleri, mai exact, metode care vor rula la inceputul procesarii fluxului (onSubscribe), la primirea fiecarui mesaj ulterior (onNext), atunci cand au loc erori (onError), si la finalizarea unui flux (onComplete):

Hai sa ne uitam la ultimul string.

locations.map(String::length).filter(l -> l >= 5).subscribe(observer);

Folosim operatorii map si filter. Daca ai lucrat cu fluxurile Java 8, stii cu siguranta sa folosesti map si filter. Aici functioneaza la fel. Diferenta este ca, in programarea reactiva, acele valori ar putea sa apara gradual. De fiecare data cand apare o noua valoare, trece prin toate transformarile. Astfel, String::length va inlocui strings to length pe fiecare linie de cod.

In acest caz, avem 5 (Minsk), 6 (Krakow), 6 (Moscow), 4 (Kiev), 5 (Sofia). Punem un filtru pentru a ramane doar cei peste 5. Obtinem astfel o lista de string lengths care au peste 5 (Kiev dispare). Abonare la fluxul final. Apoi Observer este apelat pentru a reactiona la valorile din fluxul final. Cu fiecare noua valoare, va printa lungimea:

public void onNext(Integer value) {

System.out.println(“Length: “ + value);

Mai intai, apare Length 5, apoi Length 6.Cand fluxul este finalizat, va fi apelat onComplete, si la final, o sa apara “Done.”:

public void onComplete() {

System.out.println(“Done.”);

Nu toate fluxurile pot sa completeze. Dar unele pot face asta. Spre exemplu, daca am citi ceva dintr-un fisier, fluxul va completa cand se termina fisierul.

Daca are loc o eroare, putem reactiona:

public void onError(Throwable e) {

e.printStackTrace();

Putem astfel sa reactionam in moduri diferite: la valori, inchierea unor fluxuri si erori.

The original article can be found here.

Interested in learning how to program with Java or in upgrading your Java programming skills? Check out our trainings.

Originally published at https://www.luxoft-training.ro.