Rxjava ডক switchmap সংজ্ঞা বরং অস্পষ্ট হয় এবং এটি লিঙ্ক একই পৃষ্ঠায় flatmap হিসাবে। দুই অপারেটরের মধ্যে পার্থক্য কী?
Rxjava ডক switchmap সংজ্ঞা বরং অস্পষ্ট হয় এবং এটি লিঙ্ক একই পৃষ্ঠায় flatmap হিসাবে। দুই অপারেটরের মধ্যে পার্থক্য কী?
উত্তর:
ডকুমেন্টেশন অনুসারে ( http://reactivex.io/docamentation/operators/flatmap.html )
এর switchMap
মতো flatMap
, তবে উত্স পর্যবেক্ষণযোগ্য থেকে কোনও নতুন ইভেন্ট নির্গত না হওয়া অবধি এটি কেবলমাত্র পর্যবেক্ষণযোগ্য থেকে আইটেমগুলি নির্গত হবে।
মার্বেল চিত্রটি এটি ভালভাবে দেখায়। চিত্রের পার্থক্যটি লক্ষ্য করুন:
ইন switchMap
দ্বিতীয় মূল নির্গমন ( সবুজ মার্বেল ) তার দ্বিতীয় বের না হয় ম্যাপ নির্গমন ( সবুজ বর্গক্ষেত্র ), তৃতীয় থেকে মূল নির্গমন ( নীল মার্বেল ) শুরু হয়েছে এবং ইতিমধ্যে তার প্রথম নির্গত ম্যাপ নির্গমন ( নীল হীরা )। অন্য কথায়, শুধুমাত্র প্রথম দুই ম্যাপ সবুজ নির্গমন ঘটে; কোনও সবুজ বর্গ নির্গত হয় না কারণ নীল রঙের হীরাটি এটি পরাজিত করে।
ইন flatMap
, সমস্ত ম্যাপযুক্ত ফলাফলগুলি "বাসি" হলেও নির্গত হবে। অন্য কথায়, ম্যাপযুক্ত সবুজ নির্গমনের প্রথম এবং দ্বিতীয় উভয়ই ঘটে - একটি সবুজ বর্গক্ষেত্র নির্গত হত (যদি তারা মানচিত্রের ক্রমাগত ব্যবহার করত; যেহেতু তারা না করে, আপনি দ্বিতীয় সবুজ হীরা দেখতে পান , যদিও এটি পরে নির্গত হয়) প্রথম নীল হীরা)
সমতল মানচিত্র
.map(func).switch
তবে এটি একই রকম .switchMap(func)
।
"তাত্ক্ষণিক অনুসন্ধান" প্রয়োগ করার সময় আমি এটি পেরিয়ে এসেছি - যেমন যখন কোনও পাঠ্য বাক্সে ব্যবহারকারী টাইপ করেন এবং ফলাফলগুলি প্রতিটি কী স্ট্রোকের সাথে রিয়েল-টাইমের নিকটে উপস্থিত হয়। সমাধানটি মনে হয়:
ফ্ল্যাটম্যাপের সাহায্যে অনুসন্ধানের ফলাফলগুলি বাসি হতে পারে, কারণ অনুসন্ধান প্রতিক্রিয়াগুলি ক্রম থেকে ফিরে আসতে পারে। এটি ঠিক করার জন্য, সুইচম্যাপ ব্যবহার করা উচিত, যেহেতু এটি নিশ্চিত করে যে কোনও পুরানো পর্যবেক্ষণযোগ্য নতুন সরবরাহ সরবরাহ করা হলে এটি বাতিল হয়ে যায়।
সুতরাং, সংক্ষেপে, ফ্ল্যাটম্যাপটি ব্যবহার করা উচিত যখন সমস্ত ফলাফল নির্ধারিত নির্বিশেষে, এবং সুইচম্যাপ ব্যবহার করা উচিত যখন কেবলমাত্র শেষ পর্যবেক্ষণযোগ্য পদার্থের ফলাফল।
কোন flatMap আলোচনা তুলনা এবং বিপরীত ছাড়া সম্পূর্ণ হয় switchMap
, concatMap
এবং concatMapEager
।
এই সমস্ত পদ্ধতির একটি গ্রহণ করে Func1
যা পরে প্রবাহিত হয় Observable
যা স্ট্রিমটিকে রূপান্তর করে ; পার্থক্য হ'ল যখন প্রত্যাবর্তিত Observable
গুলি সাবস্ক্রাইব এবং সাবস্ক্রাইব করা হয়, এবং যদি এবং কখন সেগুলির প্রশ্নে অপারেটর Observable
দ্বারা নির্গমন হয় ____Map
।
flatMap
Observable
যতটা সম্ভব নির্গমনকারীদের সাবস্ক্রাইব করে । (এটি একটি প্ল্যাটফর্ম নির্ভর সংখ্যা eg উদাহরণস্বরূপ অ্যান্ড্রয়েডের একটি কম নম্বর) অর্ডার গুরুত্বপূর্ণ না হলে এটি ব্যবহার করুন এবং আপনি ASAP হিসাবে নির্গমন চান।concatMap
প্রথমটিতে Observable
সাবস্ক্রাইব করে এবং পূর্বেরটি Observable
সম্পূর্ণ হয়ে গেলে কেবল পরবর্তীটিতে সাবস্ক্রাইব করে । অর্ডার গুরুত্বপূর্ণ হলে আপনি এটি ব্যবহার করুন এবং আপনি সংস্থান সংরক্ষণ করতে চান। একটি নিখুঁত উদাহরণটি প্রথমে ক্যাশেটি পরীক্ষা করে কোনও নেটওয়ার্ক কলকে পিছিয়ে দেওয়া। এটি সাধারণত একটি দ্বারা অনুসরণ করা যেতে পারে .first()
বা .takeFirst()
অপ্রয়োজনীয় কাজ করা এড়াতে।
http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/
concatMapEager
একই কাজ করে তবে যথাসময়ে সাবস্ক্রাইব করে (প্ল্যাটফর্ম নির্ভর) তবে পূর্ববর্তীটি Observable
সম্পন্ন হওয়ার পরে কেবল এটি নির্গত হবে । আপনার যখন সমান্তরাল-প্রসেসিংয়ের অনেকগুলি কাজ করার দরকার হয় তখনই পারফেক্ট, তবে (ফ্ল্যাটম্যাপের বিপরীতে) আপনি মূল ক্রম বজায় রাখতে চান।
switchMap
Observable
এটির মুখোমুখি সর্বশেষে সাবস্ক্রাইব হবে এবং পূর্ববর্তী সমস্ত Observable
এস থেকে সদস্যতা রদ করুন । এটি অনুসন্ধান-পরামর্শের মতো মামলার জন্য উপযুক্ত: একবার কোনও ব্যবহারকারী তাদের অনুসন্ধান অনুসন্ধানে পরিবর্তন করে নিলে, পুরানো অনুরোধটি আর আগ্রহের বিষয় নয়, তাই এটি সদস্যতা ছাড়ানো হয়, এবং একটি ভাল আচরণ করা এপিআই-পয়েন্ট নেটওয়ার্ক অনুরোধ বাতিল করে দেয়।আপনি যদি আবার আসছেন Observable
যা subscribeOn
অন্য কোনও থ্রেড নয়, উপরের সমস্ত পদ্ধতিতে একই রকম আচরণ হতে পারে। আকর্ষণীয় এবং কার্যকর আচরণটি যখন আপনি নেস্টেডদের Observable
তাদের নিজস্ব থ্রেডে কাজ করার অনুমতি দেন তখনই উদ্ভূত হয়। তারপর আপনি সমান্তরাল প্রক্রিয়াজাতকরণ থেকে বেনিফিট অনেক পাওয়া পেতে পারেন, এবং intelligently আন-সাবস্ক্রাইব বা থেকে সাবস্ক্রাইব না Observable
গুলি যে আপনার আগ্রহের না Subscriber
গুলি
amb
আগ্রহেরও হতে পারে। যে কোনও সংখ্যা দেওয়া Observable
এটি একই আইটেমগুলি নির্গত করে যা প্রথমে 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
আগে এসেছিল, এই গুরুত্বপূর্ণ দিকটি মিস করেছে, এখন সবকিছু পরিষ্কার। ধন্যবাদ.
একসময় সুইচম্যাপকে ফ্ল্যাটম্যাপলটেস্ট বলা হত 4-এ সুইচম্যাপকে ।
এটি মূলত সাম্প্রতিকতম পর্যবেক্ষণযোগ্য এবং পূর্ববর্তীগুলির থেকে সদস্যতা ছাড়াই ইভেন্টগুলিতে চলে আসে ।
মানচিত্র, ফ্ল্যাটম্যাপ, কনক্যাটম্যাপ এবং সুইচম্যাপ কোনও ফাংশন প্রয়োগ করে বা পর্যবেক্ষণযোগ্য দ্বারা নির্গত ডেটা পরিবর্তন করে।
মানচিত্র একটি উত্স পর্যবেক্ষণযোগ্য দ্বারা নির্গত প্রতিটি আইটেমকে সংশোধন করে এবং পরিবর্তিত আইটেমটি নির্গত করে।
ফ্ল্যাটম্যাপ, সুইচম্যাপ এবং কনক্যাটম্যাপ প্রতিটি নির্গত আইটেমের জন্য একটি ফাংশন প্রয়োগ করে তবে পরিবর্তিত আইটেমটি ফিরিয়ে দেওয়ার পরিবর্তে এটি পর্যবেক্ষণযোগ্য নিজেই ফিরিয়ে দেয় যা আবার ডেটা নির্গত করতে পারে।
ফ্ল্যাটম্যাপ এবং কনক্যাটম্যাপের কাজ বেশ একই রকম। তারা একাধিক পর্যবেক্ষণযোগ্যদের দ্বারা নির্গত আইটেমগুলিকে মার্জ করে এবং একক পর্যবেক্ষণযোগ্যকে ফেরত দেয়।
যদি আপনি একটি উদাহরণ কোড খুঁজছেন
/**
* 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
আপনি দেখবেন যে এ উপেক্ষা করা হয়েছে।