Operator digunakan untuk menyelesaikan masalah mengubah objek yang dapat diamati. Operator digunakan untuk memodifikasi peristiwa yang dipancarkan oleh yang dapat diamati antara yang dapat diamati dan pelanggan akhir. RXJAVA menyediakan banyak operator yang berguna.
Misalnya, operator peta digunakan untuk mengubah satu acara menjadi acara lainnya.
Observable.
Menggunakan lambda dapat disederhanakan
Observable.
Bukankah itu keren? Operator peta () digunakan untuk mengubah objek yang dapat diamati. Operator peta mengembalikan objek yang dapat diamati, sehingga panggilan rantai dapat diimplementasikan, dan operator peta digunakan beberapa kali pada objek yang dapat diamati, dan akhirnya data paling sederhana diteruskan ke objek pelanggan.
Operator Peta Lanjutan
Yang lebih menarik tentang operator peta adalah bahwa ia tidak harus mengembalikan jenis yang dikembalikan oleh objek yang dapat diamati. Anda dapat menggunakan operator peta untuk mengembalikan objek yang dapat diamati yang memancarkan tipe data baru.
Misalnya, dalam contoh di atas, pelanggan tidak peduli dengan string yang dikembalikan, tetapi menginginkan nilai hash dari string.
Observable.
Sangat menarik, bukan? Awal kami yang dapat diamati mengembalikan string, sedangkan pelanggan akhir menerima bilangan bulat. Tentu saja, menggunakan lambda dapat lebih menyederhanakan kode:
Observable.
Seperti yang disebutkan sebelumnya, semakin sedikit hal yang berlangganan, semakin baik. Mari kita tambahkan operator peta lain.
Observable.
Tidak yakin?
Apakah Anda pikir contoh kami terlalu mudah untuk meyakinkan Anda? Anda perlu memahami dua poin berikut:
1. Observable dan pelanggan dapat melakukan apa saja
Diobservasi dapat berupa kueri basis data, dan pelanggan digunakan untuk menampilkan hasil kueri; Observable dapat berupa acara klik di layar, dan pelanggan digunakan untuk merespons untuk mengklik peristiwa; Diobservasi dapat berupa permintaan jaringan, dan pelanggan digunakan untuk menampilkan hasil permintaan.
2. Terbiati dan pelanggan tidak tergantung pada proses transformasi menengah.
Sejumlah peta dapat ditambahkan atau dikurangi antara yang dapat diamati dan pelanggan. Seluruh sistem sangat dapat dikombinasikan, dan data operasi adalah proses yang sangat sederhana.
Contoh
1. Persiapan
Misalkan saya memiliki metode seperti ini:
Metode ini mengembalikan daftar URL situs web berdasarkan string input (AHHA, mesin pencari)
Observable <Daftar <String>> Query (Teks String);
Sekarang saya ingin membangun sistem yang kuat yang dapat meminta string dan menampilkan hasilnya. Berdasarkan konten blog sebelumnya, kami dapat menulis kode berikut:
query ("Halo, dunia!") .subscribe (urls -> {for (string url: urls) {system.out.println (url);}});Tentu saja, kode semacam ini tidak dapat ditoleransi, karena kode di atas telah menyebabkan kami kehilangan kemampuan untuk mengubah aliran data. Setelah kami ingin mengubah setiap URL, kami hanya dapat melakukannya di pelanggan. Kami tidak menggunakan operator peta () yang keren! Lai Lai
Tentu saja, saya dapat menggunakan operator peta. Input peta adalah daftar URLS. Saat memproses, masih perlu melintasi masing -masing, yang juga sangat menyakitkan.
Untungnya, ada juga metode yang dapat diamati.
Observable.from ("url1", "url2", "url3") .subscribe (url -> system.out.println (url)); Mari kita gunakan metode ini untuk adegan sekarang:
query ("Halo, World!") .subscribe (urls -> {Observable.from (urls) .subscribe (url -> system.out.println (url));});
Meskipun untuk setiap loop dihapus, kode masih terlihat berantakan. Beberapa langganan bersarang tidak hanya terlihat jelek dan sulit untuk dimodifikasi, tetapi lebih serius, itu akan menghancurkan beberapa fitur RXJava yang belum kami sebutkan.
2. Peningkatan
Juruselamat ada di sini, dia flatmap ().
Observable.FlatMap () menerima output dari yang dapat diamati sebagai input dan output lain yang dapat diamati secara bersamaan. Lihat langsung pada kode:
query ("Halo, World!") .FlatMap (func1 baru <Daftar <String>, Observable <string> () {@Override Public Observable <string> panggilan (Daftar <String> URLS) {return Observable.from (urls);}) .subscribe (url -System.out.printls); Di sini saya memposting seluruh kode fungsi untuk memfasilitasi Anda untuk memahami apa yang sedang terjadi. Menggunakan lambda dapat sangat menyederhanakan panjang kode:
kueri ("Halo, dunia!") .FlatMap (URLS -> Observable.from (URLS)) .Subscribe (URL -> System.out.println (URL));Apakah flatmap () terlihat aneh? Mengapa ia mengembalikan yang lain yang dapat diamati? Titik kunci dalam memahami flatmap adalah bahwa output baru yang dapat diamati dari FlatMap adalah persis apa yang ingin kami terima di pelanggan. Sekarang Pelanggan tidak lagi menerima Daftar <String>, tetapi sebaliknya menerima beberapa string kolom tunggal, seperti output dari Observable.from ().
Bagian ini juga merupakan bagian yang paling sulit ketika saya pertama kali belajar RXJAVA. Begitu saya tiba -tiba menyadarinya, banyak pertanyaan di RXJava diselesaikan.
3. Ini bisa lebih baik
FlatMap () benar -benar bukan ide yang lebih baik, itu dapat mengembalikan objek yang dapat diamati yang ingin dikembalikannya.
Misalnya, metode berikut:
// Kembalikan judul situs web, dan jika 404, kembalikan null Observable <string> gettitle (string url);
Mengikuti contoh sebelumnya, sekarang saya tidak ingin mencetak URL lagi, tetapi malah mencetak judul setiap situs web yang saya terima. Masalahnya adalah bahwa metode saya hanya dapat melewati satu URL pada satu waktu, dan nilai pengembalian bukanlah string, tetapi objek yang diamati yang menghasilkan string. Menggunakan flatmap () dapat dengan mudah menyelesaikan masalah ini.
query ("Halo, dunia!") .FlatMap (URLS -> Observable.from (URLS)) .FlatMap (func1 baru <String, Observable <String> () {@Override Public Observable <string> call (string url) {return getTitle (url);}}). 4. Gunakan Lambda:
query ("Halo, dunia!") .FlatMap (URLS -> Observable.from (URLS)) .FlatMap (URL -> GetTitle (URL)) .Subscribe (title -> System.out.println (judul)); Bukankah terasa luar biasa? Saya sebenarnya dapat menggabungkan beberapa metode independen untuk mengembalikan objek yang dapat diamati bersama -sama! Sangat tampan!
Lebih dari itu, saya juga menggabungkan panggilan dua API ke dalam panggilan rantai. Kami dapat menautkan sebanyak mungkin panggilan API. Setiap orang harus tahu betapa menyakitkannya menyinkronkan semua panggilan API dan kemudian menggabungkan hasil panggilan balik dari semua panggilan API ke dalam data yang akan ditampilkan. Di sini kami berhasil menghindari callback neraka (callback bersarang multi-lapisan, membuat kode sulit dibaca dan dipelihara). Sekarang semua logika dibungkus ke dalam panggilan responsif sederhana ini.
5. Operator Kaya <BR /> Sejauh ini, kami telah berhubungan dengan dua operator, dan ada lebih banyak operator di RXJava, jadi bagaimana kami menggunakan operator lain untuk meningkatkan kode kami?
gettitle () mengembalikan nol jika url tidak ada. Kami tidak ingin mengeluarkan "null", maka kami dapat memfilter nilai nol dari daftar judul yang dikembalikan!
kueri ("Halo, dunia!") .flatmap (urls -> observable.from (urls)) .flatmap (url -> gettitle (url)) .filter (judul -> judul! = null) .subscribe (title -> System.out.println (judul));filter () mengeluarkan elemen yang sama dengan input dan memfilter yang tidak memenuhi kriteria cek.
Jika kita hanya ingin hingga 5 hasil:
query ("Halo, dunia!") .flatmap (urls -> observable.from (urls)) .flatMap (url -> getTitle (url)) .filter (title -> title! = null) .take (5) .subscribe (judul -> System.Out.Out.println (title));ambil () output jumlah maksimum hasil.
Jika kami ingin menyimpan setiap judul ke disk sebelum mencetak:
kueri ("Halo, dunia!") .FlatMap (URLS -> Observable.From (URLS)) .FlatMap (URL -> GetTitle (URL)) .Filter (Judul -> Judul! = NULL) .Take (5) .doonNext (Judul -> SavetItle (Title)) .Subscribe -TitlePy -).doonnext () memungkinkan kita untuk melakukan beberapa hal tambahan sebelum mengeluarkan elemen pada satu waktu, seperti menyimpan judul di sini.
Apakah mudah untuk melihat betapa mudahnya mengoperasikan aliran data di sini? Anda dapat menambahkan operasi sebanyak yang Anda suka dan tidak mengacaukan kode Anda.
RXJAVA berisi sejumlah besar operator. Jumlah operator agak menakutkan, tetapi perlu diperiksa satu per satu sehingga Anda dapat mengetahui operator mana yang dapat digunakan. Mungkin perlu waktu untuk memahami operator ini, tetapi begitu Anda mengerti, Anda akan sepenuhnya memahami kekuatan RXJava.
Anda bahkan dapat menulis operator khusus! Blog ini tidak bermaksud untuk menyesuaikan operator. Jika Anda mau, silakan google sendiri.
Bagaimana perasaanmu?
Nah, Anda seorang skeptis dan sulit untuk meyakinkan, jadi mengapa Anda peduli dengan operator ini?
Karena operator memungkinkan Anda melakukan apa pun pada aliran data.
Menghubungkan serangkaian operator dapat mencapai logika yang kompleks. Kode ini dipecah menjadi serangkaian cuplikan yang dapat digabungkan. Ini adalah pesona pemrograman fungsi reaktif. Semakin banyak Anda menggunakannya, semakin banyak Anda akan mengubah pemikiran pemrograman Anda.
Selain itu, RXJava juga memudahkan kami untuk memproses data. Dalam contoh terakhir, kami memanggil dua API, memproses data yang dikembalikan oleh API, dan menyimpannya ke disk. Tetapi pelanggan kami tidak tahu ini, itu hanya berpikir ia menerima objek <string> yang dapat diamati. Kemasan yang bagus juga membawa kenyamanan pengkodean!
Pada bagian ketiga, saya akan memperkenalkan beberapa fitur keren RXJava lainnya, seperti penanganan kesalahan dan konkurensi, yang tidak secara langsung digunakan untuk memproses data.