জাভা 8 স্ট্রিমগুলি কি আরএক্সজাভা পর্যবেক্ষণের মতো?
জাভা 8 স্ট্রিম সংজ্ঞা:
নতুন
java.util.stream
প্যাকেজের ক্লাসগুলি উপাদানগুলির স্ট্রিমগুলিতে ক্রিয়ামূলক-স্টাইলের ক্রিয়াকলাপগুলিকে সমর্থন করার জন্য একটি স্ট্রিম এপিআই সরবরাহ করে।
জাভা 8 স্ট্রিমগুলি কি আরএক্সজাভা পর্যবেক্ষণের মতো?
জাভা 8 স্ট্রিম সংজ্ঞা:
নতুন
java.util.stream
প্যাকেজের ক্লাসগুলি উপাদানগুলির স্ট্রিমগুলিতে ক্রিয়ামূলক-স্টাইলের ক্রিয়াকলাপগুলিকে সমর্থন করার জন্য একটি স্ট্রিম এপিআই সরবরাহ করে।
উত্তর:
টিএল; ডিআর : সমস্ত সিকোয়েন্স / স্ট্রিম প্রসেসিং লিব পাইপলাইন বিল্ডিংয়ের জন্য খুব অনুরূপ এপিআই দিচ্ছে। পার্থক্যগুলি বহু-থ্রেডিং এবং পাইপলাইনগুলির রচনা পরিচালনা করার জন্য এপিআইতে রয়েছে in
আরএক্সজাভা স্ট্রিম থেকে বেশ আলাদা different সমস্ত জেডিকে জিনিসগুলির মধ্যে, rx.Observable এর সবচেয়ে নিকটতম সম্ভবত java.util.stream. সংগ্রাহক স্ট্রিম + কমপ্লিটেবল ফিউচার কম্বো (যা অতিরিক্ত মোনাড স্তরের সাথে ডিল করার জন্য ব্যয় করে আসে, Stream<CompletableFuture<T>>
এবং এর মধ্যে রূপান্তর পরিচালনা করতে পারে CompletableFuture<Stream<T>>
)।
পর্যবেক্ষণযোগ্য এবং স্ট্রিমের মধ্যে উল্লেখযোগ্য পার্থক্য রয়েছে:
Stream#parallel()
ক্রমটি পার্টিশনে বিভক্ত হয় Observable#subscribeOn()
এবং Observable#observeOn()
হয় না; এটি Stream#parallel()
পর্যবেক্ষণযোগ্যদের সাথে আচরণ অনুকরণ করা কঠিন , এটি একবার .parallel()
পদ্ধতি ছিল তবে এই পদ্ধতির ফলে এত বিভ্রান্তি .parallel()
হয়েছিল যে সমর্থনটি গিথুব, আরএক্সজভাপারালিয়ালের পৃথক ভাণ্ডারে স্থানান্তরিত করা হয়েছিল। আরও বিশদ অন্য উত্তরে ।Stream#parallel()
xচ্ছিক সময়সূচী গ্রহণকারী বেশিরভাগ RxJava পদ্ধতির বিপরীতে, কোনও থ্রেড পুল নির্দিষ্ট করতে অনুমতি দেয় না। যেহেতু একটি জেভিএম-এ সমস্ত স্ট্রিম উদাহরণ একই কাঁটাচামচ পুল ব্যবহার করে, যোগ করা .parallel()
ভুলক্রমে আপনার প্রোগ্রামের অন্য একটি মডিউলে আচরণকে প্রভাবিত করতে পারেObservable#interval()
, Observable#window()
এবং আরও অনেক কিছু; এটি বেশিরভাগ ক্ষেত্রে কারণ স্ট্রিমগুলি পুল-ভিত্তিক হয় এবং পরবর্তী উপাদানটি নিম্ন স্রোতে কখন নির্গত হয় তার উপর উপরের কোনও নিয়ন্ত্রণ থাকে নাtakeWhile()
, takeUntil()
); ব্যবহারের Stream#anyMatch()
কাজটি সীমিত: এটি টার্মিনাল অপারেশন, সুতরাং আপনি স্ট্রিমের জন্য একাধিকবার এটি ব্যবহার করতে পারবেন নাObservable#using()
); আপনি এটির সাথে আইও স্ট্রিম বা মুটেক্সটি মোড়াতে পারেন এবং নিশ্চিত হন যে ব্যবহারকারী সংস্থানটি মুক্ত করতে ভুলে যাবেন না - এটি সাবস্ক্রিপশন সমাপ্তির পরে স্বয়ংক্রিয়ভাবে নিষ্পত্তি হবে; স্ট্রিমটির onClose(Runnable)
পদ্ধতি রয়েছে তবে আপনাকে এটিকে ম্যানুয়ালি বা সংস্থান-সংস্থান দিয়ে কল করতে হবে। E. g। আপনাকে মনে রাখতে হবে যে ফাইলগুলি # লাইন () অবশ্যই রিসোর্স-ব্লক-এর সাথে আবদ্ধ থাকতে হবে।রাউন্ড-আপ: আরএক্সজাভা স্ট্রিম থেকে উল্লেখযোগ্যভাবে পৃথক। রিয়েল আরএক্সজাভা বিকল্পগুলি রিঅ্যাকটিভ স্ট্রিমগুলির অন্যান্য বাস্তবায়ন , যেমন আককার প্রাসঙ্গিক অংশ।
আপডেট । এর জন্য অ-ডিফল্ট কাঁটাচামচ পুল ব্যবহার করার কৌশল আছে Stream#parallel
, জাভা 8 সমান্তরাল স্ট্রিমের কাস্টম থ্রেড পুল দেখুন
আপডেট । উপরের সমস্তটি আরএক্সজাভা ১.x এর অভিজ্ঞতার ভিত্তিতে তৈরি এখন যেহেতু আরএক্সজাভা ২.x এখানে রয়েছে , এই উত্তরটি পুরানো হতে পারে।
Stream.generate()
নিজের Supplier<U>
প্রয়োগটি কল করতে এবং পাস করতে পারেন , কেবলমাত্র একটি সহজ পদ্ধতি যা থেকে আপনি স্ট্রিমের পরবর্তী আইটেমটি সরবরাহ করেন। অন্যান্য পদ্ধতি প্রচুর আছে। সহজে একটি ক্রম গঠন করা Stream
যে আগের মান আপনি ব্যবহার করতে পারেন উপর নির্ভর করে interate()
পদ্ধতি, প্রত্যেক Collection
টি stream()
পদ্ধতি এবং Stream.of()
একটি নির্মান Stream
একটি ভারার্গস বা অ্যারে থেকে। শেষ StreamSupport
পর্যন্ত স্প্লিটেটরেটর ব্যবহার করে বা স্ট্রিমের আদিম ধরণের জন্য আরও উন্নত স্ট্রিম তৈরির পক্ষে সমর্থন রয়েছে।
takeWhile()
, takeUntil()
);" - জেডিকে 9 এর এইগুলি রয়েছে, আমি বিশ্বাস করি, টোকওয়াইল () এবং ড্রপওয়াইলে ()
জাভা 8 স্ট্রিম এবং আরএক্সজাভা দেখতে বেশ একই রকম দেখাচ্ছে। তাদের দেখতে একই রকম অপারেটর রয়েছে (ফিল্টার, মানচিত্র, ফ্ল্যাটম্যাপ ...) তবে একই ব্যবহারের জন্য নির্মিত হয় না।
আপনি আরএক্সজাভা ব্যবহার করে অ্যাসিচোনাস কার্য সম্পাদন করতে পারেন।
জাভা 8 স্ট্রিমের সাহায্যে আপনি আপনার সংগ্রহের আইটেমগুলি অতিক্রম করবেন।
আপনি আরএক্সজাভাতে খুব একই জিনিস করতে পারেন (কোনও সংগ্রহের ট্র্যাভারস আইটেম) তবে, যেমনটি আরএক্সজাভা সাম্প্রতিক টাস্কে মনোনিবেশ করা হয়েছে, ... এটি সিঙ্ক্রোনাইজেশন, ল্যাচ ব্যবহার করে ... সুতরাং আরএক্সজেভা ব্যবহার করে একই কাজটি ধীর হতে পারে may জাভা 8 স্ট্রিম সহ।
আরএক্সজাভা এর সাথে তুলনা করা যেতে পারে CompletableFuture
তবে এটি কেবল একটি মানের চেয়ে বেশি গণনা করতে সক্ষম হতে পারে।
parallelStream
সহজ traversals এর অনুরূপ সিঙ্ক্রোনাইজেশন সমর্থন / মানচিত্র / ফিল্টারিং ইত্যাদি ..
কয়েকটি প্রযুক্তিগত এবং ধারণাগত পার্থক্য রয়েছে, উদাহরণস্বরূপ, জাভা 8 টি স্ট্রিমগুলি একক ব্যবহার, টান ভিত্তিক, মানগুলির সিঙ্ক্রোনাস সিকোয়েন্স যেখানে আরএক্সজাভা অবজার্ভেবলগুলি পুনরায় পর্যবেক্ষণযোগ্য, অভিযোজিতভাবে পুশ-পুল ভিত্তিক, সম্ভাব্য মানগুলির সম্ভাব্য অ্যাসিনক্রোনাস ক্রম। আরএক্সজাভা জাভা 6+ এর লক্ষ্য এবং এটি অ্যান্ড্রয়েডেও কাজ করে।
জাভা 8 স্ট্রিমগুলি পুল ভিত্তিক। আপনি প্রতিটি আইটেম গ্রাস করে একটি জাভা 8 স্ট্রিমের মাধ্যমে পুনরাবৃত্তি করুন। এবং এটি একটি অন্তহীন স্রোত হতে পারে।
আরএক্সজাভা Observable
ডিফল্ট পুশ ভিত্তিক। আপনি একটি পর্যবেক্ষণযোগ্যতে সাবস্ক্রাইব করে রেখেছেন এবং পরবর্তী আইটেমটি উপস্থিত হলে ( onNext
), বা স্ট্রিমটি ( onCompleted
) শেষ হলে বা কোনও ত্রুটি ঘটলে (আপনি onError
) বিজ্ঞপ্তি পাবেন । সঙ্গে যেহেতু Observable
আপনি পাবেন onNext
, onCompleted
, onError
ঘটনা, আপনি কিছু ক্ষমতাশালী ফাংশন বিভিন্ন মিশ্রন মত কি করতে পারেন Observable
একটি নতুন এক গুলি ( zip
, merge
, concat
)। আপনি করতে পারেন এমন অন্যান্য জিনিস হ'ল ক্যাশিং, থ্রোটল্টিং, ... এবং এটি বিভিন্ন ভাষায় কম-বেশি একই এপিআই ব্যবহার করে (RxJava, R # C, RxJS, ...)
ডিফল্টরূপে আরএক্সজাভা একক থ্রেডযুক্ত। আপনি শিডিয়ুলার ব্যবহার শুরু না করা পর্যন্ত সবকিছু একই থ্রেডে ঘটবে।
বিদ্যমান উত্তরগুলি ব্যাপক এবং সঠিক, তবে নতুনদের জন্য একটি সুস্পষ্ট উদাহরণের অভাব রয়েছে। আমাকে "পুশ / পুল-ভিত্তিক" এবং "পুনরায় পর্যবেক্ষণযোগ্য" এর মতো শর্তগুলির পিছনে কিছু কংক্রিট রাখার অনুমতি দিন। দ্রষ্টব্য : আমি এই শব্দটিকে ঘৃণা করি Observable
(এটি স্বর্গের জন্য একটি স্রোত), তাই কেবল জে 8 বনাম আরএক্স স্ট্রিমগুলি উল্লেখ করবে।
পূর্ণসংখ্যার একটি তালিকা বিবেচনা করুন,
digits = [1,2,3,4,5]
একটি জে 8 স্ট্রিম সংগ্রহটি সংশোধন করার জন্য একটি ইউটিলিটি। উদাহরণস্বরূপ এমনকি অঙ্কগুলিও এ হিসাবে বের করা যেতে পারে,
evens = digits.stream().filter(x -> x%2).collect(Collectors.toList())
এটি মূলত জাফলার তুলনায় পাইথনের মানচিত্র, ফিল্টার, হ্রাস , খুব সুন্দর (এবং দীর্ঘতর ছাড়) addition তবে কী আগে যদি অঙ্কগুলি আগে না সংগ্রহ করা হত - অ্যাপটি চলাকালীন অঙ্কগুলি যদি স্ট্রিমিং করছিল - তবে আমরা কি রিয়েলটাইমে এমনকি এর সংখ্যাকে ফিল্টার করতে পারি?
কল্পনা করুন যে অ্যাপটি চলাকালীন একটি পৃথক থ্রেড প্রক্রিয়া এলোমেলো সময়ে পূর্ণসংখ্যাকে আউটপুট দিচ্ছে ( ---
সময়কে বোঝায়)
digits = 12345---6------7--8--9-10--------11--12
হয়েছে RX সালে even
পারেন প্রতিক্রিয়া প্রতিটি নতুন অঙ্ক প্রয়োজন এবং রিয়েল টাইমে ফিল্টার প্রয়োগ করুন
even = -2-4-----6---------8----10------------12
ইনপুট এবং আউটপুট তালিকাগুলি সংরক্ষণ করার দরকার নেই। আপনি যদি কোনও আউটপুট তালিকা চান তবে কোনও সমস্যা এটি স্ট্রাইমেবল। আসলে, সবকিছুই একটি স্রোত।
evens_stored = even.collect()
এই কারণেই "স্টেটলেস" এবং "ফাংশনাল" এর মতো শব্দগুলি আরএক্সের সাথে বেশি যুক্ত
আরএক্সজাভা প্রতিক্রিয়াশীল স্ট্রিম উদ্যোগের সাথেও ঘনিষ্ঠভাবে জড়িত এবং এটিকে নিজেকে প্রতিক্রিয়াশীল স্ট্রিম এপিআইয়ের একটি সাধারণ বাস্তবায়ন হিসাবে বিবেচনা করে (যেমন আক্কা স্ট্রিমগুলির প্রয়োগের সাথে তুলনা করে )। মূল পার্থক্যটি হ'ল, প্রতিক্রিয়াশীল স্ট্রিমগুলি ব্যাক প্রেসার হ্যান্ডেল করতে সক্ষম হওয়ার জন্য ডিজাইন করা হয়েছে, তবে যদি আপনার প্রতিক্রিয়াশীল স্ট্রিম পৃষ্ঠাগুলি একবার দেখে থাকেন তবে আপনি ধারণাটি পাবেন। তারা তাদের লক্ষ্যগুলি বেশ ভালভাবে বর্ণনা করে এবং স্ট্রিমগুলি প্রতিক্রিয়াশীল ইশতেহারের সাথেও নিবিড়ভাবে সম্পর্কিত ।
জাভা 8 স্ট্রিমগুলি স্ক্রিন স্ট্রিম বা ক্লোজার অলস সিকের মতো একইভাবে আনবাউন্ডেড সংগ্রহের প্রয়োগ বাস্তবায়িত ।
মাল্টিকোর আর্কিটেকচারের সুবিধার্থে জাভা 8 স্ট্রিমগুলি কার্যকরভাবে বড় সংগ্রহগুলির প্রক্রিয়াকরণ সক্ষম করে। বিপরীতে, আরএক্সজাভা ডিফল্টরূপে (সিডিউলার ছাড়াই) একক থ্রেডযুক্ত। সুতরাং আরএক্সজেভা মাল্টি-কোর মেশিনের সুবিধা নেবে না যদি না আপনি নিজের পক্ষে যুক্তিটি কোড করেন।