Mengenal Konsep Reactive Programming di Java

Ichwan Sholihin
4 min readOct 2, 2023

--

Photo by Victor on Unsplash

Halo semua, pada artikel kali ini saya akan membahas tentang reactive programming, salah satu topik yang sangat penting untuk proses yang cepat, responsif dan efisien.

Reactive programming adalah paradigma pemrograman yang berfokus pada aliran data dan peristiwa (event). Dalam model ini, aplikasi dirancang untuk merespons secara otomatis terhadap perubahan-perubahan yang terjadi dalam sistem, seperti perubahan nilai variabel, input pengguna, perubahan status koneksi jaringan, dan lain sebagainya. Tujuan utama dari reactive programming adalah membuat aplikasi yang responsif, elastis (scalable), dan mudah untuk mengelola aliran data yang kompleks.

Pada reactive programming, data dan event dianggap sebagai aliran yang dapat diobservasi (observable streams). Aplikasi yang menggunakan paradigma ini menggunakan struktur data yang disebut Observables dan Observers. Observables mewakili aliran data atau peristiwa, sementara Observers adalah komponen yang “mendengarkan” atau “mengamati” aliran tersebut dan merespons terhadap setiap elemen data yang diterima atau setiap peristiwa yang terjadi.

Beberapa konsep kunci dalam reactive programming meliputi:

1. Observables: Observables adalah sumber dari aliran data atau peristiwa. Mereka menghasilkan data atau peristiwa dan mengirimkannya kepada Observers.

2. Observers: Observers adalah komponen yang mengamati Observables. Mereka merespons terhadap data atau peristiwa yang diterima dari Observables.

3. Operators: Operators memungkinkan transformasi dan manipulasi data yang mengalir melalui Observables. Mereka memungkinkan pengolahan data, penggabungan aliran data, dan manipulasi data secara bersamaan.

4. Subscriptions: Subscriptions mewakili hubungan antara Observables dan Observers. Observers “subscribe” ke Observables untuk menerima data atau peristiwa yang dihasilkan oleh Observables.

Keuntungan utama dari reactive programming meliputi:

- Responsif: Aplikasi reactive dapat merespons dengan cepat terhadap perubahan data atau peristiwa, membuatnya ideal untuk pengembangan aplikasi real-time dan interaktif.

- Elastis: Reactive programming memungkinkan aplikasi untuk mengelola beban kerja yang bervariasi dengan baik. Mereka dapat mengatasi peningkatan beban dengan memanfaatkan konsep backpressure yang memungkinkan kontrol laju data.

- Fleksibel: Reactive programming memungkinkan penggunaan komposisi operasi yang fleksibel, memungkinkan pengembang untuk menggabungkan dan memanipulasi aliran data dengan mudah.

- Manajemen Kesalahan: Reactive programming menyediakan mekanisme yang baik untuk menangani kesalahan dalam aliran data, memastikan bahwa aplikasi tetap berjalan bahkan ketika terjadi kesalahan.

Reactive programming digunakan luas dalam pengembangan aplikasi web, aplikasi mobile, aplikasi real-time, dan aplikasi yang memerlukan penanganan data yang kompleks dan dinamis. Beberapa bahasa pemrograman dan framework populer yang mendukung reactive programming termasuk Java dengan RxJava dan Project Reactor, JavaScript dengan RxJS, dan banyak lagi. Namun pada artikel ini, kita akan membahas penerapan reactive programming pada java, mulai dari builder class yang menggunakan konsep aliran seperti Stream pada Java 8 dan Flow pada Java 9, serta penggunaan third party library pendukung seperti RxJava dan Project Reactor.

Stream dari Java 1.8: Memanfaatkan Operasi Fungsional pada Koleksi Data

Java 1.8 memperkenalkan Stream API, sebuah pendekatan yang memungkinkan penggunaan ekspresi lambda untuk melakukan operasi pada koleksi data. Stream API memungkinkan pengembang untuk melakukan operasi seperti filter, map, reduce, dan lainnya, pada koleksi data dengan sintaksis yang bersih. Penggunaan Stream API membantu menciptakan kode yang lebih legible dan mudah dipahami.

Contoh penggunaan Stream API:

List<String> words = Arrays.asList("hello", "world", "example", "java", "stream");
List<String> result = words.stream()
.filter(word -> word.length() > 4)
.map(String::toUpperCase)
.collect(Collectors.toList());

Dalam contoh di atas, kita menggunakan operasi filter untuk menyaring kata-kata dengan panjang lebih dari 4 karakter, kemudian map digunakan untuk mengonversi kata-kata tersebut menjadi huruf besar, dan hasilnya dikumpulkan ke dalam sebuah list.

Referensi: https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html

Flow API dari Java 1.9: Mengelola Aliran Data Asinkron dengan Backpressure

Java 1.9 memperkenalkan Flow API, yang merupakan bagian dari paket java.util.concurrent. Flow API menyediakan dukungan untuk Reactive Streams di Java. Reactive Streams adalah spesifikasi yang memungkinkan proses asinkron dengan backpressure, memungkinkan komunikasi antara produsen dan konsumen dengan laju yang dapat diatur. Dengan Flow API, pengembang dapat mengelola aliran data asinkron dengan lebih baik.

Contoh antarmuka Flow API:

Flow.Publisher<String> publisher = ...; // Definisikan publisher
Flow.Subscriber<String> subscriber = ...; // Definisikan subscriber
publisher.subscribe(subscriber);

Pada contoh di atas, Publisher adalah sumber data asinkron, sedangkan Subscriber adalah penerima data yang akan meresponsnya.

Referensi: https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/Flow.html

RxJava: Menggunakan Observables dan Observers untuk Mengelola Aliran Data

RxJava adalah implementasi dari Reactive Extensions (Rx) untuk Java. Dalam RxJava, aliran data diwakili oleh Observables, sedangkan konsumennya diwakili oleh Observers. RxJava memungkinkan komposisi operasi asinkron dan peristiwa dalam gaya fungsional. Dengan RxJava, pengembang dapat mengelola aliran data kompleks dengan mudah.

Contoh penggunaan RxJava:

Observable<String> observable = Observable.just("hello", "world");
observable.subscribe(
item -> System.out.println("Received: " + item),
error -> System.err.println("Error: " + error),
() -> System.out.println("Done")
);

Pada contoh di atas, kita membuat sebuah Observable yang menghasilkan dua string, dan kemudian kita men-subscribe-nya dengan tiga callback: untuk menerima item, menangani kesalahan, dan menangani penyelesaian.

Referensi: https://github.com/ReactiveX/RxJava

Project Reactor: Menangani Aliran Data dengan Mono dan Flux

Project Reactor adalah framework pemrograman reaktif yang dikembangkan oleh Pivotal Software. Project Reactor menyediakan dua jenis publisher: Mono (menghasilkan nol atau satu item) dan Flux (menghasilkan nol atau banyak item). Project Reactor memungkinkan pengembang untuk menggunakan pemrograman reaktif dengan antarmuka yang bersih dan kuat.

Contoh penggunaan Project Reactor:

Flux<String> flux = Flux.just("hello", "world");
flux.subscribe(
item -> System.out.println("Received: " + item),
error -> System.err.println("Error: " + error),
() -> System.out.println("Done")
);

Dalam contoh ini, kita membuat sebuah Flux yang menghasilkan dua string, kemudian kita men-subscribe-nya dengan tiga callback serupa dengan RxJava.

Referensi: https://projectreactor.io/docs

Kesimpulan

Reactive programming memberikan pendekatan yang powerful dan fleksibel untuk mengelola aliran data dan peristiwa dalam pengembangan Java. Dari Stream API dalam Java 1.8 yang fokus pada koleksi data, hingga Flow API, RxJava, dan Project Reactor yang mendukung aliran data asinkron dengan berbagai tingkat kompleksitas, para pengembang memiliki sejumlah pilihan untuk mencapai responsivitas dan efisiensi dalam aplikasi mereka.

Dengan memahami konsep-konsep tersebut, pengembang Java dapat memilih alat yang sesuai dengan kebutuhan mereka dan mengembangkan aplikasi yang responsif, efisien, dan mudah dikelola. Dalam dunia yang terus berubah dan semakin kompleks, memahami pemrograman reaktif adalah keterampilan yang sangat berharga untuk dimiliki oleh para pengembang Java.

Sign up to discover human stories that deepen your understanding of the world.

--

--

Ichwan Sholihin
Ichwan Sholihin

Written by Ichwan Sholihin

Software Developer at AXA Indonesia

No responses yet

Write a response