আরএক্সজেবাতে ফ্ল্যাটম্যাপ এবং সুইচম্যাপের মধ্যে পার্থক্য কী?


149

Rxjava ডক switchmap সংজ্ঞা বরং অস্পষ্ট হয় এবং এটি লিঙ্ক একই পৃষ্ঠায় flatmap হিসাবে। দুই অপারেটরের মধ্যে পার্থক্য কী?


1
এ সম্পর্কে ফ্ল্যাটম্যাপ হিসাবে একই পৃষ্ঠায় লিঙ্ক । এটা সত্যিই সত্য। তবে ভাষা-নির্দিষ্ট তথ্য বিভাগে স্ক্রোল করুন এবং আকর্ষণীয় অপারেটরটি খুলুন। আমি মনে করি এটি টিওসি থেকে স্বয়ংক্রিয়ভাবে করা উচিত, তবে ... এছাড়াও আপনি জাভাডোকে একই চিত্র দেখতে পাবেন
রুসলান স্টেলমাচেঙ্কো

উত্তর:


180

ডকুমেন্টেশন অনুসারে ( http://reactivex.io/docamentation/operators/flatmap.html )

এর switchMapমতো flatMap, তবে উত্স পর্যবেক্ষণযোগ্য থেকে কোনও নতুন ইভেন্ট নির্গত না হওয়া অবধি এটি কেবলমাত্র পর্যবেক্ষণযোগ্য থেকে আইটেমগুলি নির্গত হবে।

মার্বেল চিত্রটি এটি ভালভাবে দেখায়। চিত্রের পার্থক্যটি লক্ষ্য করুন:

ইন switchMapদ্বিতীয় মূল নির্গমন ( সবুজ মার্বেল ) তার দ্বিতীয় বের না হয় ম্যাপ নির্গমন ( সবুজ বর্গক্ষেত্র ), তৃতীয় থেকে মূল নির্গমন ( নীল মার্বেল ) শুরু হয়েছে এবং ইতিমধ্যে তার প্রথম নির্গত ম্যাপ নির্গমন ( নীল হীরা )। অন্য কথায়, শুধুমাত্র প্রথম দুই ম্যাপ সবুজ নির্গমন ঘটে; কোনও সবুজ বর্গ নির্গত হয় না কারণ নীল রঙের হীরাটি এটি পরাজিত করে।

ইন flatMap, সমস্ত ম্যাপযুক্ত ফলাফলগুলি "বাসি" হলেও নির্গত হবে। অন্য কথায়, ম্যাপযুক্ত সবুজ নির্গমনের প্রথম এবং দ্বিতীয় উভয়ই ঘটে - একটি সবুজ বর্গক্ষেত্র নির্গত হত (যদি তারা মানচিত্রের ক্রমাগত ব্যবহার করত; যেহেতু তারা না করে, আপনি দ্বিতীয় সবুজ হীরা দেখতে পান , যদিও এটি পরে নির্গত হয়) প্রথম নীল হীরা)

switchMap সুইচম্যাপে যদি মূল পর্যবেক্ষণযোগ্য নতুন কিছু নির্গত করে, পূর্বের নির্গমন আর ম্যাপযুক্ত পর্যবেক্ষণগুলি তৈরি করে না;  বাসি ফলাফল এড়াতে এটি কার্যকর উপায়

সমতল মানচিত্র

সুইচম্যাপে যদি মূল পর্যবেক্ষণযোগ্য নতুন কিছু নির্গত করে, পূর্বের নির্গমন আর ম্যাপযুক্ত পর্যবেক্ষণগুলি তৈরি করে না;  এটি বাসির ফলাফলগুলি এভুইয়ের কার্যকর উপায়


4
ধন্যবাদ, চিত্রটি খুব সহায়ক। আপনি কি এমন একটি বাস্তব বিশ্বের উদাহরণ জানেন যেখানে সুইচম্যাপ ব্যবহৃত হবে?
জুলিয়ান গো

1
@ জুলিয়ানগো এখানে একটি উদাহরণ রয়েছে: github.com/samuelgruetter/rx-playground/blob/master/… এটি ব্যবহার করে .map(func).switchতবে এটি একই রকম .switchMap(func)
স্যামুয়েল গ্রুয়েটার

2
যদি কারও এখনও সুইচম্যাপের বাস্তব বিশ্বের উদাহরণ প্রয়োজন হয় তবে তিনি এই লিঙ্কটির লিঙ্কটি অনুসরণ করতে পারেন এবং ফ্ল্যাটম্যাপের পরিবর্তে কখন সুইচথ্যাপ ব্যবহার করবেন তা এটি বুঝতে পারে।
hermannovich

2
উদাহরণস্বরূপ, আরএক্সজেএস 5 ব্যবহার করে বেন লেশ থেকে সুইচম্যাপ ব্যবহার করুন - 25-26 মিনিট এখানে দেখুন - youtube.com/watch?v=3LKMwkuK0ZE আমার জন্য, ফ্ল্যাটম্যাপটি ইতিমধ্যে বোঝা গিয়েছিল ...
আর্কসেল্ডন

7
মার্বেল ডায়াগ্রাম ভাল দেখায়? কি? আপনি যদি ইতিমধ্যে সম্ভবত সুইচম্যাপ বুঝতে পারি তবে আমার ধারণা।
হেলজগেট

166

"তাত্ক্ষণিক অনুসন্ধান" প্রয়োগ করার সময় আমি এটি পেরিয়ে এসেছি - যেমন যখন কোনও পাঠ্য বাক্সে ব্যবহারকারী টাইপ করেন এবং ফলাফলগুলি প্রতিটি কী স্ট্রোকের সাথে রিয়েল-টাইমের নিকটে উপস্থিত হয়। সমাধানটি মনে হয়:

  1. স্ট্রিংয়ের পাবলিক্স সাবজেক্টের মতো একটি বিষয় রয়েছে
  2. পাঠ্য বাক্সে কলব্যাক পরিবর্তন করুন .অনেক্সট (পাঠ্য) টিপুন
  3. সার্ভার ক্যোয়ারী রেট সীমাবদ্ধ করতে .debounce ফিল্টার প্রয়োগ করুন
  4. সার্ভারের ক্যোয়ারী সম্পাদন করতে .switchMap প্রয়োগ করুন - অনুসন্ধান শব্দটি গ্রহণ করা এবং অনুসন্ধানের পুনরায় পর্যবেক্ষণযোগ্য পর্যবেক্ষণযোগ্য ফিরিয়ে দেওয়া
  5. SearchResponse গ্রহন করে এবং ইউআই আপডেট করে এমন একটি পদ্ধতির সাথে সাবস্ক্রাইব করুন।

ফ্ল্যাটম্যাপের সাহায্যে অনুসন্ধানের ফলাফলগুলি বাসি হতে পারে, কারণ অনুসন্ধান প্রতিক্রিয়াগুলি ক্রম থেকে ফিরে আসতে পারে। এটি ঠিক করার জন্য, সুইচম্যাপ ব্যবহার করা উচিত, যেহেতু এটি নিশ্চিত করে যে কোনও পুরানো পর্যবেক্ষণযোগ্য নতুন সরবরাহ সরবরাহ করা হলে এটি বাতিল হয়ে যায়।

সুতরাং, সংক্ষেপে, ফ্ল্যাটম্যাপটি ব্যবহার করা উচিত যখন সমস্ত ফলাফল নির্ধারিত নির্বিশেষে, এবং সুইচম্যাপ ব্যবহার করা উচিত যখন কেবলমাত্র শেষ পর্যবেক্ষণযোগ্য পদার্থের ফলাফল।



95

কোন flatMap আলোচনা তুলনা এবং বিপরীত ছাড়া সম্পূর্ণ হয় switchMap, concatMapএবং concatMapEager

এই সমস্ত পদ্ধতির একটি গ্রহণ করে Func1যা পরে প্রবাহিত হয় Observableযা স্ট্রিমটিকে রূপান্তর করে ; পার্থক্য হ'ল যখন প্রত্যাবর্তিত Observableগুলি সাবস্ক্রাইব এবং সাবস্ক্রাইব করা হয়, এবং যদি এবং কখন সেগুলির প্রশ্নে অপারেটর Observableদ্বারা নির্গমন হয় ____Map

  • flatMapObservableযতটা সম্ভব নির্গমনকারীদের সাবস্ক্রাইব করে । (এটি একটি প্ল্যাটফর্ম নির্ভর সংখ্যা eg উদাহরণস্বরূপ অ্যান্ড্রয়েডের একটি কম নম্বর) অর্ডার গুরুত্বপূর্ণ না হলে এটি ব্যবহার করুন এবং আপনি ASAP হিসাবে নির্গমন চান।
  • concatMapপ্রথমটিতে Observableসাবস্ক্রাইব করে এবং পূর্বেরটি Observableসম্পূর্ণ হয়ে গেলে কেবল পরবর্তীটিতে সাবস্ক্রাইব করে । অর্ডার গুরুত্বপূর্ণ হলে আপনি এটি ব্যবহার করুন এবং আপনি সংস্থান সংরক্ষণ করতে চান। একটি নিখুঁত উদাহরণটি প্রথমে ক্যাশেটি পরীক্ষা করে কোনও নেটওয়ার্ক কলকে পিছিয়ে দেওয়া। এটি সাধারণত একটি দ্বারা অনুসরণ করা যেতে পারে .first()বা .takeFirst()অপ্রয়োজনীয় কাজ করা এড়াতে।

    http://blog.danlew.net/2015/06/22/loading-data-from-multiple-sources-with-rxjava/

  • concatMapEagerএকই কাজ করে তবে যথাসময়ে সাবস্ক্রাইব করে (প্ল্যাটফর্ম নির্ভর) তবে পূর্ববর্তীটি Observableসম্পন্ন হওয়ার পরে কেবল এটি নির্গত হবে । আপনার যখন সমান্তরাল-প্রসেসিংয়ের অনেকগুলি কাজ করার দরকার হয় তখনই পারফেক্ট, তবে (ফ্ল্যাটম্যাপের বিপরীতে) আপনি মূল ক্রম বজায় রাখতে চান।

  • switchMapObservableএটির মুখোমুখি সর্বশেষে সাবস্ক্রাইব হবে এবং পূর্ববর্তী সমস্ত Observableএস থেকে সদস্যতা রদ করুন । এটি অনুসন্ধান-পরামর্শের মতো মামলার জন্য উপযুক্ত: একবার কোনও ব্যবহারকারী তাদের অনুসন্ধান অনুসন্ধানে পরিবর্তন করে নিলে, পুরানো অনুরোধটি আর আগ্রহের বিষয় নয়, তাই এটি সদস্যতা ছাড়ানো হয়, এবং একটি ভাল আচরণ করা এপিআই-পয়েন্ট নেটওয়ার্ক অনুরোধ বাতিল করে দেয়।

আপনি যদি আবার আসছেন Observableযা subscribeOnঅন্য কোনও থ্রেড নয়, উপরের সমস্ত পদ্ধতিতে একই রকম আচরণ হতে পারে। আকর্ষণীয় এবং কার্যকর আচরণটি যখন আপনি নেস্টেডদের Observableতাদের নিজস্ব থ্রেডে কাজ করার অনুমতি দেন তখনই উদ্ভূত হয়। তারপর আপনি সমান্তরাল প্রক্রিয়াজাতকরণ থেকে বেনিফিট অনেক পাওয়া পেতে পারেন, এবং intelligently আন-সাবস্ক্রাইব বা থেকে সাবস্ক্রাইব না Observableগুলি যে আপনার আগ্রহের না Subscriberগুলি

  • ambআগ্রহেরও হতে পারে। যে কোনও সংখ্যা দেওয়া Observableএটি একই আইটেমগুলি নির্গত করে যা প্রথমে Observableযে কোনওটি নির্গত করে। এটি কার্যকর হতে পারে যখন আপনার কাছে একাধিক উত্স থাকে যা একই জিনিসটি ফেরত দিতে পারে / করতে পারে এবং আপনি সম্পাদনা চান। উদাহরণস্বরূপ বাছাই করা, আপনি ambএকত্রিতকরণ-বাছাইয়ের সাথে দ্রুততর বাছাই এবং যেকোন দ্রুত ব্যবহার করতে পারেন।

1
If you are returning Observables that don't subscribeOn another thread, all of the above methods may behave much the same.- আমার প্রতিটি ব্যাখ্যা এর switchMap vs flatMapআগে এসেছিল, এই গুরুত্বপূর্ণ দিকটি মিস করেছে, এখন সবকিছু পরিষ্কার। ধন্যবাদ.
অ্যান্ডি রেস

55

একসময় সুইচম্যাপকে ফ্ল্যাটম্যাপলটেস্ট বলা হত 4-এ সুইচম্যাপকে ।

এটি মূলত সাম্প্রতিকতম পর্যবেক্ষণযোগ্য এবং পূর্ববর্তীগুলির থেকে সদস্যতা ছাড়াই ইভেন্টগুলিতে চলে আসে ।


@ এপিকপান্ডাফোরস যদিও এটি কম্বিনেস্টেস্টের সাথে অসামঞ্জস্যপূর্ণ, যখনই কোনও উত্স পর্যবেক্ষণযোগ্য উত্স নির্গত হয় (একবারে প্রকাশিত হয় না) সর্বশেষ মানগুলি প্রকাশ করে।
মাইকেল ফ্রাই

2
আংশিক কারণ হিসাবে এটি সুইচম্যাপ বলা হয় কারণ আপনি o.map (...) ব্যবহার করে এই অপারেটরটি নিজেই প্রয়োগ করতে পারেন switch সুইচ ()। তবুও আমি কল্পনা করব এটি মানচিত্রের সুইচ হবে, যা এত সহজে জিহ্বাকে ঘুরিয়ে দেবে বলে মনে হয় না।
নিয়াল কান্নাটন

7

মানচিত্র, ফ্ল্যাটম্যাপ, কনক্যাটম্যাপ এবং সুইচম্যাপ কোনও ফাংশন প্রয়োগ করে বা পর্যবেক্ষণযোগ্য দ্বারা নির্গত ডেটা পরিবর্তন করে।

  • মানচিত্র একটি উত্স পর্যবেক্ষণযোগ্য দ্বারা নির্গত প্রতিটি আইটেমকে সংশোধন করে এবং পরিবর্তিত আইটেমটি নির্গত করে।

  • ফ্ল্যাটম্যাপ, সুইচম্যাপ এবং কনক্যাটম্যাপ প্রতিটি নির্গত আইটেমের জন্য একটি ফাংশন প্রয়োগ করে তবে পরিবর্তিত আইটেমটি ফিরিয়ে দেওয়ার পরিবর্তে এটি পর্যবেক্ষণযোগ্য নিজেই ফিরিয়ে দেয় যা আবার ডেটা নির্গত করতে পারে।

  • ফ্ল্যাটম্যাপ এবং কনক্যাটম্যাপের কাজ বেশ একই রকম। তারা একাধিক পর্যবেক্ষণযোগ্যদের দ্বারা নির্গত আইটেমগুলিকে মার্জ করে এবং একক পর্যবেক্ষণযোগ্যকে ফেরত দেয়।

  • ফ্ল্যাটম্যাপ এবং কনক্যাটম্যাপের মধ্যে পার্থক্য হ'ল ক্রমটি যাতে আইটেমগুলি নির্গত হয়।
  • ফ্ল্যাটম্যাপ প্রসারণের সময় আইটেমগুলি ইন্টারলিভ করতে পারে অর্থাৎ নির্গত আইটেমগুলির অর্ডার বজায় থাকে না।
  • কনক্যাটম্যাপ আইটেমগুলির ক্রম সংরক্ষণ করে। তবে কনক্যাট্যাপের প্রধান অসুবিধাটি হ'ল, প্রতিটি পর্যবেক্ষককে তার কাজ শেষ করার জন্য অপেক্ষা করতে হবে সুতরাং অ্যাসিনক্রোনাস রক্ষণাবেক্ষণ হয় না।
  • সুইচম্যাপ ফ্ল্যাটম্যাপ এবং কনক্যাটম্যাপ থেকে কিছুটা আলাদা । পূর্ববর্তী উত্স থেকে স্যুইচম্যাপ সাবস্ক্রাইবযোগ্য পর্যবেক্ষণযোগ্য যখনই নতুন আইটেম নির্গত হতে শুরু করে, এইভাবে সর্বদা পর্যবেক্ষণযোগ্য থেকে আইটেমগুলি নির্গত করা হয়।

1

যদি আপনি একটি উদাহরণ কোড খুঁজছেন

/**
 * 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


4
তবে আপনি সুইচম্যাপের মূল বৈশিষ্ট্যটি মিস করেছেন যা এটি ফ্ল্যাটম্যাপ থেকে পৃথক করে - কেবলমাত্র সাম্প্রতিক পর্যবেক্ষণযোগ্য বিষয়গুলি, পূর্ববর্তীগুলি থেকে সাবস্ক্রাইব করার সময়।
আর্টেম নোভিকভ

3
এই উদাহরণে, আপনি এটির switchMapসাথে প্রতিস্থাপন করলে flatMapঠিক একই কাজ করবে।
পাইটর উইটচেন

1

এখানে আরও একটি - 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

আপনি দেখবেন যে এ উপেক্ষা করা হয়েছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.