Perbezaan Antara Flatmap dan Switchmap di RxJava

1. Gambaran keseluruhan

RxJava menyediakan pelbagai pengendali untuk mengubah item yang dipancarkan oleh sesuatu yang dapat dilihat menjadi yang lain Dua pengendali yang paling popular adalah flatMap dan switchMap . Perbezaan antara keduanya sering sukar difahami untuk pemula dalam pengaturcaraan reaktif.

Untuk pengenalan mengenai RxJava, rujuk artikel ini.

Dalam tutorial ini, kita akan memahami perbezaannya dengan membaca contoh mudah.

2. peta rata

The flatMap operator menukarkan setiap item pulang dari sumber yang boleh diperhatikan ke dalam diperhatikan bebas menggunakan fungsi yang dibekalkan dan kemudian memasukkan semua cerap menjadi diperhatikan tunggal . Susunan yang cerap digabungkan tidak dijamin sama seperti dalam sumber diperhatikan.

Mari kita ambil mesin carian sebagai contoh. Pertimbangkan bahawa kami ingin memaparkan hasil carian segera setelah kami memasukkan setiap watak perkataan:

Demi kesederhanaan, kami telah mengambil input pertanyaan carian sebagai senarai perkataan.

Kami juga selalu mengembalikan dua hasil carian untuk setiap perkataan.

// given List actualOutput = new ArrayList(); TestScheduler scheduler = new TestScheduler(); List keywordToSearch = Arrays.asList("b", "bo", "boo", "book", "books"); // when Observable.fromIterable(keywordToSearch) .flatMap(s -> Observable.just(s + " FirstResult", s + " SecondResult") .delay(10, TimeUnit.SECONDS, scheduler)) .toList() .doOnSuccess(s -> actualOutput.addAll(s)) .subscribe(); scheduler.advanceTimeBy(1, TimeUnit.MINUTES); // then assertThat(actualOutput, hasItems("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", "books FirstResult", "books SecondResult"));

Harap maklum bahawa pesanan tidak selalu sama dengan setiap larian.

3. peta peta

The switchMap pengendali adalah sama dengan flatMap , kecuali bahawa ia mengekalkan hasil hanya boleh diperhatikan, membuang yang sebelumnya terkini.

Mari ubah keperluan kami kerana kami ingin mendapatkan hasil carian hanya untuk kata akhir yang terbentuk sepenuhnya (dalam kes ini, "buku") dan bukan untuk rentetan pertanyaan separa. Untuk mencapainya, kita boleh menggunakan switchMap .

Sekiranya kita hanya mengganti flatMap dengan switchMap dalam contoh kod di atas, pernyataan berikut akan berlaku:

assertEquals(2, actualOutput.size()); assertThat(actualOutput, hasItems("books FirstResult", "books SecondResult"));

Seperti yang kita lihat di sini, kita hanya mendapat satu pemerhatian yang mengandungi item input terbaru dari sumber yang dapat dilihat. Semua hasil sebelumnya dibuang.

4. Kesimpulan

Untuk meringkaskan, switchMap berbeza dari flatMap kerana ia hanya mengekalkan output dari penerapan fungsi yang disediakan pada item terbaru yang dikeluarkan oleh sumber yang dapat Diperhatikan, flatMap , di sisi lain, mengekalkan semua hasil dan mengembalikannya secara interleave tanpa menjamin pesanan.

Seperti biasa, kod yang digunakan dalam artikel ini terdapat di GitHub.