জাভা 8 কনস্ট্রাক্টস List<String> stringList
ব্যবহার করে যা বিভিন্ন উপায়ে মুদ্রণ করা যায় তা বিবেচনা করুন :
stringList.forEach(System.out::println); // 1) Iterable.forEach
stringList.stream().forEach(System.out::println); // 2) Stream.forEach (order maintained generally but doc does not guarantee)
stringList.stream().forEachOrdered(System.out::println); // 3) Stream.forEachOrdered (order maintained always)
stringList.parallelStream().forEach(System.out::println); // 4) Parallel version of Stream.forEach (order not maintained)
stringList.parallelStream().forEachOrdered(System.out::println); // 5) Parallel version ofStream.forEachOrdered (order maintained always)
এই পদ্ধতিগুলি একে অপরের থেকে আলাদা কীভাবে?
প্রথম পদ্ধতির ( Iterable.forEach
) -
সংগ্রহের পুনরুক্তিটি সাধারণত ব্যবহৃত হয় এবং এটি ব্যর্থ-দ্রুত ডিজাইন করা হয়েছে যার অর্থ ConcurrentModificationException
অন্তর্নিহিত সংগ্রহটি পুনরাবৃত্তির সময় কাঠামোগতভাবে সংশোধন করা হলে এটি নিক্ষেপ করবে । হিসাবে উল্লেখ করেছে ডক জন্য ArrayList
:
কাঠামোগত পরিবর্তন হ'ল এমন কোনও ক্রিয়াকলাপ যা এক বা একাধিক উপাদান যুক্ত করে বা মুছে ফেলে বা স্পষ্টভাবে ব্যাকিং অ্যারেটিকে আকার দেয়; নিছক কোনও উপাদানের মান নির্ধারণ কোনও কাঠামোগত পরিবর্তন নয়।
সুতরাং এটির ArrayList.forEach
মান নির্ধারণের জন্য কোনও সমস্যা ছাড়াই অনুমোদিত। এবং সমকালীন সংগ্রহের ক্ষেত্রে যেমন ConcurrentLinkedQueue
পুনরুক্তিটি দুর্বল-সামঞ্জস্যপূর্ণ হবে যার অর্থ পাস হওয়া ক্রিয়াকলাপগুলি ব্যতিক্রম forEach
ছাড়াই কাঠামোগত পরিবর্তন আনতে অনুমোদিত ConcurrentModificationException
। তবে এখানে পরিবর্তনগুলি সেই পুনরাবৃত্তিতে প্রদর্শিত হতে পারে বা নাও হতে পারে।
দ্বিতীয় পদ্ধতির ( Stream.forEach
) -
অর্ডার অপরিজ্ঞাত। যদিও এটি অনুক্রমিক স্ট্রিমগুলির জন্য না ঘটে তবে স্পেসিফিকেশন এটির গ্যারান্টি দেয় না। এছাড়াও পদক্ষেপটি প্রকৃতির হস্তক্ষেপ না করা প্রয়োজন। ডক হিসাবে উল্লিখিত :
এই অপারেশনের আচরণটি স্পষ্টতই নিরপেক্ষবাদী। সমান্তরাল স্ট্রিম পাইপলাইনগুলির জন্য, এই অপারেশনটি স্ট্রিমের এনকাউন্টার অর্ডারকে সম্মান করার গ্যারান্টি দেয় না কারণ এটি করা সমান্তরালতার সুবিধাটিকে ত্যাগ করবে।
তৃতীয় পদ্ধতির ( Stream.forEachOrdered
) -
ক্রিয়াটি স্ট্রিমের এনকাউন্টার ক্রমে সম্পাদিত হবে। সুতরাং যখনই অর্ডার বিষয়গুলি forEachOrdered
দ্বিতীয় চিন্তা ছাড়াই ব্যবহার করুন । ডক হিসাবে উল্লিখিত :
এই স্ট্রিমের প্রতিটি উপাদানটির জন্য একটি ক্রিয়া সম্পাদন করে, স্ট্রিমটির এনকাউন্টার ক্রমে স্ট্রিমের যদি সংজ্ঞায়িত এনক্রোয়ার অর্ডার থাকে।
একটি উপর iterating যদিও সিঙ্ক্রোনাইজ সংগ্রহে প্রথম পদ্ধতির সংগ্রহ লক লাগবে একবার এবং কলের কর্ম পদ্ধতি, কিন্তু প্রবাহের ক্ষেত্রে তারা সংগ্রহ এর spliterator, যা লক করে না এবং অ এর বর্তমানে প্রতিষ্ঠিত নিয়ম উপর নির্ভর ব্যবহার সব জুড়ে এটি রাখা হবে -interference। সংগ্রহের ব্যাকিংয়ের ক্ষেত্রে স্ট্রিমটি পুনরাবৃত্তির সময় সংশোধন করা হয় একটি ConcurrentModificationException
নিক্ষিপ্ত হবে বা বেমানান ফলাফল হতে পারে।
চতুর্থ পন্থা (সমান্তরাল Stream.forEach
) -
যেমন ইতিমধ্যে সমান্তরাল স্ট্রিমের ক্ষেত্রে প্রত্যাশা অনুযায়ী এনকাউন্টার অর্ডারকে সম্মান করার কোনও গ্যারান্টি নেই। এটি সম্ভব যে ক্রিয়াকলাপটি বিভিন্ন থ্রেডে বিভিন্ন উপাদানের জন্য করা হয় যা কখনই হতে পারে না forEachOrdered
।
পঞ্চম অভিগমন (সমান্তরাল Stream.forEachOrdered
) -forEachOrdered
উৎস আসলে নির্বিশেষে দ্বারা নির্দিষ্ট অনুক্রমে উপাদানের প্রক্রিয়া হবে কিনা প্রবাহ অনুক্রমিক অথবা সমান্তরাল হয়। সুতরাং এটি সমান্তরাল স্ট্রিমগুলির সাথে ব্যবহার করার কোনও অর্থ নেই।
List
হতে ঘোষণা করেছেন ? আপনি কীভাবে এটি ঘোষণা এবং তাত্ক্ষণিক করেছিলেন তা আমাদের দেখান।