rxjava docคำนิยามของ switchmap ค่อนข้างคลุมเครือและจะเชื่อมโยงไปยังหน้าเดียวกันเป็น flatmap ความแตกต่างระหว่างผู้ประกอบการทั้งสองคืออะไร?
rxjava docคำนิยามของ switchmap ค่อนข้างคลุมเครือและจะเชื่อมโยงไปยังหน้าเดียวกันเป็น flatmap ความแตกต่างระหว่างผู้ประกอบการทั้งสองคืออะไร?
คำตอบ:
อ้างอิงจากเอกสาร ( http://reactivex.io/documentation/operators/flatmap.html )
switchMap
เป็นเหมือนflatMap
, แต่มันจะปล่อยเฉพาะรายการจากที่สังเกตใหม่จนกว่าเหตุการณ์ใหม่จะถูกปล่อยออกมาจากแหล่งที่มาที่สังเกตได้
แผนภาพหินอ่อนแสดงให้เห็นว่าดี สังเกตเห็นความแตกต่างในไดอะแกรม:
ในswitchMap
การปล่อยดั้งเดิมครั้งที่สอง( หินอ่อนสีเขียว ) ไม่ปล่อยการปล่อยแมปที่สองของมัน( สี่เหลี่ยมจัตุรัสสีเขียว ) เนื่องจากการปล่อยดั้งเดิมที่สาม( หินอ่อนสีน้ำเงิน ) เริ่มขึ้นแล้วปล่อยการปล่อยแมปแรก( เพชรสีน้ำเงิน ) ในคำอื่น ๆ เพียง แต่เป็นครั้งแรกของทั้งสองแมปการปล่อยก๊าซสีเขียวเกิดขึ้น; ไม่มีช่องสี่เหลี่ยมสีเขียวถูกปล่อยออกมาเนื่องจากเพชรสีฟ้าทุบมัน
ในflatMap
ผลลัพธ์ที่แมปทั้งหมดจะถูกปล่อยออกมาแม้ว่าพวกเขาจะ "ค้าง" ในคำอื่น ๆทั้งสองครั้งแรกและสองของแมปการปล่อยก๊าซสีเขียวเกิดขึ้น - เป็นสี่เหลี่ยมสีเขียวจะได้รับการปล่อยออกมา (ถ้าพวกเขาใช้ฟังก์ชั่นแผนที่ที่สอดคล้องกันและเนื่องจากพวกเขาไม่ได้คุณจะเห็นสองเพชรสีเขียวแม้ว่ามันจะถูกปล่อยออกมาหลังจากที่แรกเพชรสีฟ้า)
flatMap
.map(func).switch
.switchMap(func)
ฉันเจอสิ่งนี้เมื่อใช้ "การค้นหาทันที" - เช่นเมื่อผู้ใช้พิมพ์ในกล่องข้อความและผลลัพธ์ปรากฏขึ้นแบบเรียลไทม์ด้วยการกดปุ่มแต่ละครั้ง การแก้ปัญหาน่าจะเป็น:
ด้วย flatMap ผลการค้นหาอาจค้างเนื่องจากคำตอบการค้นหาอาจกลับมาไม่เป็นระเบียบ ในการแก้ไขปัญหานี้ควรใช้ switchMap เนื่องจากจะทำให้มั่นใจได้ว่าสามารถสังเกตได้แบบเก่าไม่สามารถบอกรับสมาชิกได้เมื่อมีการสร้างใหม่
ดังนั้นโดยสรุป flatMap ควรใช้เมื่อผลลัพธ์ทั้งหมดมีความหมายโดยไม่คำนึงถึงช่วงเวลาและควรใช้ switchMap เมื่อผลลัพธ์จากสสารที่สังเกตได้เท่านั้น
การอภิปรายไม่ flatMap สมบูรณ์โดยไม่ต้องเปรียบเทียบความแตกต่างกับswitchMap
, และconcatMap
concatMapEager
วิธีการเหล่านี้ทั้งหมดใช้การFunc1
แปลงกระแสเป็นObservable
s ซึ่งถูกปล่อยออกมาแล้ว; ความแตกต่างคือเมื่อObservable
s ที่ส่งคืนถูกสมัครและยกเลิกการสมัครสมาชิกและหากและเมื่อใดและการปล่อยของObservable
s เหล่านั้นถูกปล่อยออกมาโดย____Map
ผู้ประกอบการที่มีปัญหา
flatMap
สมัครรับข้อมูลที่ปล่อยออกมาObservable
ให้มากที่สุด (เป็นหมายเลขที่ขึ้นอยู่กับแพลตฟอร์มเช่นจำนวนที่ต่ำกว่าบน Android) ใช้สิ่งนี้เมื่อคำสั่งซื้อไม่สำคัญและคุณต้องการการปล่อยโดยเร็วconcatMap
สมัครสมาชิกคนแรกObservable
และคนเดียวสมัครสมาชิกต่อไปObservable
เมื่อคนก่อนหน้าได้เสร็จสิ้น ใช้สิ่งนี้เมื่อคำสั่งซื้อมีความสำคัญและคุณต้องการประหยัดทรัพยากร ตัวอย่างที่สมบูรณ์แบบคือการชะลอการเรียกเครือข่ายโดยการตรวจสอบแคชก่อน โดยทั่วไปอาจตามด้วย.first()
หรือ.takeFirst()
เพื่อหลีกเลี่ยงการทำงานที่ไม่จำเป็น
http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
ทำงานเหมือนกันมาก แต่สมัครสมาชิกให้มากที่สุดเท่าที่จะเป็นไปได้ (ขึ้นอยู่กับแพลตฟอร์ม) แต่จะส่งเสียงเมื่อObservable
เสร็จสิ้นก่อนหน้านี้ สมบูรณ์แบบเมื่อคุณมีการประมวลผลแบบขนานจำนวนมากที่ต้องทำ แต่ (ต่างจาก flatMap) ที่คุณต้องการรักษาลำดับเดิม
switchMap
จะสมัครรับข้อมูลล่าสุดที่Observable
พบและยกเลิกการเป็นสมาชิกจากObservable
s ก่อนหน้านี้ทั้งหมด สิ่งนี้เหมาะสำหรับกรณีเช่นคำแนะนำการค้นหา: เมื่อผู้ใช้มีการเปลี่ยนแปลงคำค้นหาของพวกเขาคำขอเก่าจะไม่สนใจอีกต่อไปดังนั้นจึงยกเลิกการสมัครสมาชิกและจุดสิ้นสุด Api ที่ทำงานได้ดีจะยกเลิกคำขอเครือข่ายหากคุณกลับมาObservable
ที่ไม่มีsubscribeOn
เธรดอื่นวิธีการทั้งหมดข้างต้นอาจทำงานเหมือนกันมาก พฤติกรรมที่น่าสนใจและมีประโยชน์จะปรากฏขึ้นเมื่อคุณอนุญาตให้Observable
s ที่ซ้อนกันทำงานบนเธรดของตนเอง จากนั้นคุณจะได้รับจะได้รับประโยชน์มากจากการประมวลผลแบบขนานและชาญฉลาดยกเลิกหรือไม่สมัครจากObservable
s ที่ไม่สนใจคุณSubscriber
s
amb
อาจเป็นที่สนใจ ด้วยจำนวนObservable
s ใด ๆมันจะปล่อยไอเท็มเดียวกันกับที่อันแรกObservable
ที่ปล่อยออกมา ซึ่งอาจมีประโยชน์เมื่อคุณมีหลายแหล่งที่สามารถ / ควรส่งคืนสิ่งเดียวกันและคุณต้องการประสิทธิภาพ เช่นการเรียงลำดับคุณอาจamb
จัดเรียงอย่างรวดเร็วด้วยการผสานการจัดเรียงและใช้สิ่งที่เร็วกว่าIf you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.
- คำอธิบายทุกข้อที่switchMap vs flatMap
ฉันพบมาก่อนพลาดประเด็นสำคัญนี้ไปตอนนี้ทุกอย่างชัดเจนขึ้น ขอบคุณ.
switchMap ครั้งหนึ่งเรียกว่า flatMapLatestใน RxJS 4
มันเป็นเพียงแค่ผ่านเหตุการณ์ที่เกิดขึ้นจากObservable ล่าสุดและยกเลิกการเป็นสมาชิกจากก่อนหน้านี้
แผนที่ FlatMap, ConcatMapและSwitchMapใช้ฟังก์ชั่นหรือปรับเปลี่ยนข้อมูลที่ปล่อยออกมาโดยสังเกต
แผนที่ปรับเปลี่ยนแต่ละรายการปล่อยออกมาจากแหล่งที่สังเกตและส่งเสียงรายการปรับเปลี่ยน
FlatMap, SwitchMapและConcatMapยังใช้ฟังก์ชั่นในแต่ละรายการที่ปล่อยออกมา แต่แทนที่จะส่งคืนรายการที่แก้ไขมันจะส่งคืน Observable เองซึ่งสามารถส่งข้อมูลได้อีกครั้ง
FlatMapและConcatMapทำงานเหมือนกันมาก พวกเขารวมรายการที่ปล่อยออกมาจากหลาย Observables และส่งกลับ Observable เดียว
หากคุณกำลังมองหารหัสตัวอย่าง
/**
* We switch from original item to a new observable just using switchMap.
* It´s a way to replace the Observable instead just the item as map does
* Emitted:Person{name='Pablo', age=0, sex='no_sex'}
*/
@Test
public void testSwitchMap() {
Observable.just(new Person("Pablo", 34, "male"))
.switchMap(person -> Observable.just(new Person("Pablo", 0, "no_sex")))
.subscribe(System.out::println);
}
คุณสามารถดูตัวอย่างเพิ่มเติมได้ที่นี่https://github.com/politrons/reactive
switchMap
ด้วยflatMap
มันจะทำงานเหมือนกันทุกประการ
นี่คืออีกหนึ่ง - ยาว 101 เส้นตัวอย่างเช่น นั่นอธิบายสิ่งที่ฉัน
อย่างที่เคยถูกกล่าวไว้: มันจะเป็นสิ่งที่สังเกตได้ครั้งสุดท้าย (ช้าที่สุดถ้าคุณต้องการ) และละเว้นสิ่งที่เหลือ
ผลที่ตามมา:
Time | scheduler | state
----------------------------
0 | main | Starting
84 | main | Created
103 | main | Subscribed
118 | Sched-C-0 | Going to emmit: A
119 | Sched-C-1 | Going to emmit: B
119 | Sched-C-0 | Sleep for 1 seconds for A
119 | Sched-C-1 | Sleep for 2 seconds for B
1123 | Sched-C-0 | Emitted (A) in 1000 milliseconds
2122 | Sched-C-1 | Emitted (B) in 2000 milliseconds
2128 | Sched-C-1 | Got B processed
2128 | Sched-C-1 | Completed
คุณเห็นตัว A ถูกเพิกเฉย