The rxjava doc definisi switchmap agak kabur dan link ke halaman yang sama seperti flatMap. Apa perbedaan antara kedua operator?
reactive-programming
rx-java
Julian Go
sumber
sumber
Jawaban:
Menurut dokumentasi ( http://reactivex.io/documentation/operators/flatmap.html )
yang
switchMap
adalah sepertiflatMap
, tapi itu hanya akan memancarkan item dari diamati baru sampai acara baru yang dipancarkan dari sumber yang dapat diamati.Diagram marmer menunjukkannya dengan baik. Perhatikan perbedaan dalam diagram:
Dalam emisi asli
switchMap
kedua ( marmer hijau ) tidak memancarkan emisi yang dipetakan kedua ( kotak hijau ), karena emisi asli ketiga ( marmer biru ) telah dimulai dan sudah memancarkan emisi yang dipetakan pertama ( berlian biru ). Dengan kata lain, hanya yang pertama dari dua dipetakan emisi hijau terjadi; tidak ada kotak hijau yang dipancarkan karena berlian biru mengalahkannya.Di
flatMap
, semua hasil yang dipetakan akan dipancarkan, bahkan jika itu "basi". Dengan kata lain, baik emisi hijau pertama dan kedua yang dipetakan terjadi - kotak hijau akan dipancarkan (jika mereka menggunakan fungsi peta yang konsisten; karena tidak, Anda melihat berlian hijau kedua , meskipun dipancarkan setelah yang pertama berlian biru)switchMap
flatMap
sumber
.map(func).switch
, tapi itu sama dengan.switchMap(func)
.Saya menemukan ini ketika menerapkan "pencarian instan" - yaitu ketika pengguna mengetik dalam kotak teks, dan hasilnya muncul dalam waktu dekat dengan setiap stroke tombol. Solusinya tampaknya:
Dengan flatMap, hasil pencarian bisa basi, karena respons pencarian mungkin kembali rusak. Untuk memperbaikinya, switchMap harus digunakan, karena memastikan bahwa yang lama dapat diobservasi dibatalkan berlangganan begitu yang lebih baru disediakan.
Jadi, dalam ringkasan, flatMap harus digunakan ketika semua hasil penting, terlepas dari waktu mereka, dan switchMap harus digunakan ketika hanya hasil dari masalah yang dapat diamati terakhir.
sumber
Tidak ada diskusi flatMap yang lengkap tanpa membandingkan dan kontras dengan
switchMap
,concatMap
danconcatMapEager
.Semua metode ini mengambil a
Func1
yang mengubah aliran menjadiObservable
s yang kemudian dipancarkan; perbedaannya adalah ketika yang dikembalikanObservable
itu berlangganan dan berhenti berlangganan, dan jika dan ketika emisi merekaObservable
dikeluarkan oleh____Map
operator yang bersangkutan.flatMap
berlangganan sebanyak mungkin yang dipancarkanObservable
. (Ini adalah nomor yang bergantung pada platform. Mis. Angka yang lebih rendah pada Android) Gunakan ini ketika pesanan TIDAK penting, dan Anda ingin emisi SECEPATNYA.concatMap
berlangganan yang pertamaObservable
dan hanya berlangganan berikutnyaObservable
ketika yang sebelumnya telah selesai. Gunakan ini ketika pesanan penting dan Anda ingin menghemat sumber daya. Contoh yang sempurna adalah menunda panggilan jaringan dengan memeriksa cache terlebih dahulu. Itu biasanya dapat diikuti oleh.first()
atau.takeFirst()
untuk menghindari melakukan pekerjaan yang tidak perlu.http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
bekerja hampir sama tetapi berlangganan sebanyak mungkin (tergantung platform) tetapi hanya akan memancarkan setelah sebelumnyaObservable
telah selesai. Sempurna ketika Anda memiliki banyak pemrosesan paralel yang perlu dilakukan, tetapi (tidak seperti flatMap) Anda ingin mempertahankan pesanan asli.switchMap
akan berlangganan ke pertemuan terakhirObservable
dan berhenti berlangganan dari semua sebelumnyaObservable
. Ini sempurna untuk kasus-kasus seperti saran pencarian: setelah pengguna mengubah permintaan pencarian mereka, permintaan lama tidak lagi menarik, jadi itu berhenti berlangganan, dan titik akhir Api yang berperilaku baik akan membatalkan permintaan jaringan.Jika Anda mengembalikan
Observable
yang tidaksubscribeOn
menggunakan utas lain, semua metode di atas mungkin berperilaku sama. Perilaku menarik, dan berguna muncul ketika Anda mengizinkan sarangObservable
untuk bertindak di utas mereka sendiri. Maka Anda bisa mendapatkan banyak manfaat dari pemrosesan paralel, dan dengan cerdas berhenti berlangganan atau tidak berlangganan dariObservable
yang tidak menarik minat AndaSubscriber
.amb
mungkin juga menarik. Mengingat sejumlahObservable
s itu memancarkan item yang sama bahwa orang pertama yangObservable
memancarkan apa pun memancarkan. Itu bisa berguna ketika Anda memiliki banyak sumber yang dapat / harus mengembalikan hal yang sama dan Anda menginginkan kinerja. misalnya penyortiran, Anda mungkin menyortiramb
cepat dengan penggabungan-penggabungan dan menggunakan mana yang lebih cepat.sumber
If you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.
- setiap penjelasan yangswitchMap vs flatMap
saya temui sebelumnya, melewatkan aspek penting ini, sekarang semuanya lebih jelas. Terima kasih.switchMap dulunya disebut flatMapLatest di RxJS 4.
Ini pada dasarnya hanya meneruskan acara dari Observable terbaru dan berhenti berlangganan dari yang sebelumnya.
sumber
Peta, FlatMap, ConcatMap dan SwitchMap menerapkan fungsi atau memodifikasi data yang dipancarkan oleh Observable.
Peta memodifikasi setiap item yang dipancarkan oleh sumber. Dapat diobservasi dan memancarkan item yang dimodifikasi.
FlatMap, SwitchMap, dan ConcatMap juga menerapkan fungsi pada setiap item yang dipancarkan tetapi alih-alih mengembalikan item yang dimodifikasi, ia mengembalikan Observable sendiri yang dapat memancarkan data lagi.
Pekerjaan FlatMap dan ConcatMap hampir sama. Mereka menggabungkan item yang dipancarkan oleh beberapa Observable dan mengembalikan satu Observable tunggal.
sumber
Jika Anda mencari kode contoh
Anda dapat melihat lebih banyak contoh di sini https://github.com/politrons/reactive
sumber
switchMap
denganflatMap
itu akan bekerja sama persis.Ini adalah satu lagi - contoh panjang 101 baris . Itu menjelaskan hal bagi saya.
Seperti yang dikatakan: itu mendapat yang terakhir diamati (yang paling lambat jika Anda mau) dan mengabaikan sisanya.
Hasil dari:
Anda melihat nilai A diabaikan.
sumber