Реактивне програмування на Java

1 хв. читання

Всім привіт! Сьогодні поговоримо про реактивне програмування на Java. Для кращого сприйняття статті рекомендую ознайомитися з такими поняттями, як: Observer, Observable, Data Stream. Ну і плюсом буде знання мови Java.

Вступ

Реактивне програмування – парадигма програмування, що побудована на потоках даних та взаємному розповсюдженні змін.

Наприклад, у нас є наступний вираз:

int sum = a + b;

В імперативному стилі це означає, що sum отримує значення a + b безпосередньо під час обчислення виразу і якщо після обчислення значення змінних зміняться, то це вже ніяк не вплине на обчислений результат. Проте, в реактивному програмуванні значення sum буде автоматично оновлено, якщо a і b зміняться (навіть після обчислення результату).

В загальному, реактивне програмування – програмування з використанням асинхронних потоків даних. У певному сенсі це не є чимось новим. Наприклад, асинхронним потоком є click events. Потоки можна створити з будь-якого типу. Потік – це послідовність подій, визначених в часі.

Реактивне програмування на Java

Для реактивного програмування на 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 можуть трансформувати типи даних, фільтруючи, обробляючи й розширюючи потоки даних при необхідності.
Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 5.9K
Приєднався: 8 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація