Всім привіт! Сьогодні поговоримо про реактивне програмування на Java. Для кращого сприйняття статті рекомендую ознайомитися з такими поняттями, як: Observer, Observable, Data Stream. Ну і плюсом буде знання мови Java.
Вступ
Реактивне програмування – парадигма програмування, що побудована на потоках даних та взаємному розповсюдженні змін.
Наприклад, у нас є наступний вираз:
int sum = a + b;
В імперативному стилі це означає, що sum
отримує значення a + b
безпосередньо під час обчислення виразу і якщо після обчислення значення змінних зміняться, то це вже ніяк не вплине на обчислений результат. Проте, в реактивному програмуванні значення sum
буде автоматично оновлено, якщо a
і b
зміняться (навіть після обчислення результату).
В загальному, реактивне програмування – програмування з використанням асинхронних потоків даних. У певному сенсі це не є чимось новим. Наприклад, асинхронним потоком є click events. Потоки можна створити з будь-якого типу. Потік – це послідовність подій, визначених в часі.
Для реактивного програмування на Java ми будемо використовувати бібліотеку RxJava. Як пишуть розробники: «RxJava – реактивні розширення (Rx) для JVM, що дозволяють писати асинхронні та побудовані на подіях програми, використовуючи observable послідовності». Тобто, ключовим тут є патерн Observer.
I am reactive!
Для початку нам потрібно створити простий Observable:
Observable<String> reactiveObservable = Observable.create(
new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> sub) {
sub.onNext("I am reactive!");
sub.onCompleted();
}
}
);
Наш Observable створює рядок «I am reactive!» та завершує свою роботу. Тепер створимо Subscriber для того, щоб прийняти дані і якось їх опрацювати.
Subscriber<String> reactiveSubscriber = new Subscriber<String>() {
@Override
public void onNext(String s) {
System.out.println(s);
}
@Override
public void onCompleted() {}
@Override
public void onError(Throwable e) {}
};
Як бачимо, є 3 основні методи:
- onNext – викликається при отриманні нового значення;
- onCompleted – вказує, що робити при завершенні;
- onError – опрацювання помилок.
Наш Subscriber просто виводить в консоль отримані дані. Тепер ми можемо зв'язати Observable і Subscriber разом:
reactiveObservable.subscribe(reactiveSubscriber);
Здається, для такої простої задачі ми написали забагато коду, правда? Проте, RxJava дозволяє все це спростити:
Observable.just("I am reactive!").subscribe(System.out::println);
Зовсім інша справа.
Бібліотека підтримує різні методи для трансформації даних (детальніше тут).
Висновок
Rx – потужний інструмент, який дозволяє вирішувати проблеми в елегантному декларативному стилі, притаманному функціональному програмуванню. Rx має такі переваги:
- Події в Rx описуються в такому ж стилі, як і в інших бібліотеках, натхнених функціональним програмуванням, наприклад, Java Streams. Rx дає можливість використовувати функціональні трансформації над потоками подій.
- RxJava може бути розширена для користувача операторами. І хоча Java не дозволяє зробити це елегантним чином, RxJava пропонує всю функціональність доступну в реалізаціях Rx на будь-якій іншій мові.
- Функціональні трансформації оголошені декларативно.
- Оператори в Rx легко компонуються, щоб проводити складні операції.
- Оператори в Rx можуть трансформувати типи даних, фільтруючи, обробляючи й розширюючи потоки даних при необхідності.
Ще немає коментарів