ההבדל בין Flatmap ל- Switchmap ב- RxJava

1. סקירה כללית

RxJava מספקת למפעילים שונים להפוך פריטים שנפלטו על ידי תצפית לצפיות אחרות. שניים מהמפעילים הפופולריים ביותר הם flatMap ו switchMap. לעתים קרובות קשה להבין את ההבדל בין השניים למתחילים בתכנות תגובתיות.

לקבלת מבוא ל- RxJava, עיין במאמר זה.

במדריך זה נבין את ההבדל באמצעות דוגמה פשוטה.

2. flatMap

ה flatMap המפעיל ממיר כל פריט שהוחזר ממקור נצפה לתצפית עצמאית באמצעות הפונקציה המסופקת ואז ממזג את כל הנצפים לצפייה אחת. סדר מיזוג התצפיות אינו מובטח זהה למקור נצפה.

ניקח לדוגמא מנוע חיפוש. קחו בחשבון שאנו רוצים להציג תוצאות חיפוש מיד לאחר הקלדת כל תו של המילה:

לשם הפשטות, לקחנו את קלט שאילתת החיפוש כרשימת מילים.

כמו כן, אנו מחזירים תמיד שתי תוצאות חיפוש עבור כל מילה.

// נתון רשימה actualOutput = ArrayList חדש (); מתזמן TestScheduler = TestScheduler חדש (); רשימת 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)). מנוי (); scheduler.advanceTimeBy (1, TimeUnit.MINUTES); // ואז assertThat (actualOutput, hasItems ("b FirstResult", "b SecondResult", "boo FirstResult", "boo SecondResult", "bo FirstResult", "bo SecondResult", "book FirstResult", "book SecondResult", " ספרים FirstResult "," books SecondResult "));

שים לב שההזמנה לא תמיד זהה בכל ריצה.

3. switchMap

ה switchMap מפעיל דומה ל- flatMap, אלא שהיא שומרת על התוצאה של האחרונים שנצפו בלבד, ומשליכים את הקודמים.

בואו ונשנה את הדרישה שלנו בכך שאנחנו רוצים להשיג תוצאות חיפוש רק למילה הסופית המלאה (במקרה זה, "ספרים") ולא למחרוזות השאילתה החלקיות. כדי להשיג זאת, אנו יכולים להשתמש switchMap.

אם רק נחליף flatMap עם switchMap בדוגמת הקוד לעיל, הקבוצות הבאות יהיו תקפות:

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

כפי שאנו רואים כאן, קיבלנו רק תצפית אחת המכילה את פריט הקלט האחרון מהמקור הנצפה. כל התוצאות הקודמות הושלכו.

4. מסקנה

לסכם, switchMap שונה מ flatMap בכך שהיא שומרת רק על תפוקת החלת פונקציה מסופקת על הפריט האחרון שנפלט על ידי המקור הנצפה, flatMapלעומת זאת, שומר על כל התוצאות ומחזיר אותן באופן משולב מבלי להבטיח סדר.

כמו תמיד, הקוד המשמש במאמר זה זמין ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found