সাধারণ হ্রাস বলতে দুটি অবারিত মান যেমন আন্ত, ডাবল ইত্যাদি একত্রিত করে একটি নতুন উত্পাদন করা বোঝায় ; এটি একটি অপরিবর্তনীয় হ্রাস। বিপরীতে, সংগ্রহের পদ্ধতিটি এমন একটি ফলাফল সংগ্রহ করার জন্য ধারককে রূপান্তরিত করার জন্য ডিজাইন করা হয়েছিল যাতে ফল উত্পন্ন হওয়ার কথা।
সমস্যাটি চিত্রিত করার জন্য, ধরুন আপনি Collectors.toList()
যেমন একটি সাধারণ হ্রাস ব্যবহার করে অর্জন করতে চান
List<Integer> numbers = stream.reduce(
new ArrayList<Integer>(),
(List<Integer> l, Integer e) -> {
l.add(e);
return l;
},
(List<Integer> l1, List<Integer> l2) -> {
l1.addAll(l2);
return l1;
});
এটি এর সমতুল্য Collectors.toList()
। যাইহোক, এই ক্ষেত্রে আপনি পরিবর্তন List<Integer>
। যেহেতু আমরা জানি যে ArrayList
থ্রেড-নিরাপদ নয়, পুনরাবৃত্তির সময় এটি থেকে মানগুলি যুক্ত / অপসারণ করাও নিরাপদ নয় যাতে আপনি হয় সাম্প্রতিক ব্যতিক্রম পাবেন বাArrayIndexOutOfBoundsException
তালিকাটি আপডেট করার সাথে সংযোগকারী বা কোনও ধরণের ব্যতিক্রম (বিশেষত সমান্তরালে চালিত হলে) পাবেন you তালিকাগুলি মার্জ করার চেষ্টা করে কারণ আপনি এটিতে পূর্ণসংখ্যা সংগ্রহ করে (যোগ করে) তালিকার পরিবর্তন করছেন। আপনি যদি এই থ্রেড-নিরাপদ করতে চান আপনাকে প্রতিবার একটি নতুন তালিকা পাস করতে হবে যা কার্য সম্পাদনকে ক্ষতিগ্রস্থ করবে।
বিপরীতে, Collectors.toList()
একই ধরণের কাজ করে। তবে আপনি তালিকায় মানগুলি সংগ্রহ করার সময় এটি থ্রেড সুরক্ষার গ্যারান্টি দেয়। পদ্ধতির জন্য ডকুমেন্টেশনcollect
থেকে :
একজন সংগ্রাহক ব্যবহার করে এই স্ট্রিমের উপাদানগুলিতে একটি পরিবর্তনীয় হ্রাস অপারেশন সম্পাদন করে। যদি স্ট্রিমটি সমান্তরাল হয়, এবং কালেক্টর সমবর্তী হয়, এবং হয় স্ট্রিমটি আনর্ডারড হয় বা সংগ্রাহক আনর্ডারড হয় না, তবে একযোগে হ্রাস করা হবে। সমান্তরালে কার্যকর করা হলে, একাধিক অন্তর্বর্তী ফলাফল তাত্ক্ষণিকভাবে, জনবহুল হতে পারে এবং একত্রিত হতে পারে যাতে পরিবর্তনীয় ডেটা কাঠামোর বিচ্ছিন্নতা বজায় রাখতে পারে। অতএব, অ-থ্রেড-নিরাপদ ডেটা স্ট্রাকচারের (যেমন অ্যারেলিস্ট) সমান্তরালে সম্পাদিত হয়ে গেলেও সমান্তরাল হ্রাসের জন্য কোনও অতিরিক্ত সিঙ্ক্রোনাইজেশন প্রয়োজন হয় না।
সুতরাং আপনার প্রশ্নের উত্তর দিতে:
আপনি কখন collect()
বনাম ব্যবহার করবেন reduce()
?
যদি আপনি যেমন অপরিবর্তনীয় মান ints
, doubles
, Strings
তারপর স্বাভাবিক হ্রাস মাত্র কাজ করে জরিমানা। যাইহোক, যদি reduce
আপনার মানগুলি List
(পরিবর্তনীয় ডেটা কাঠামো) বলতে হয় তবে আপনাকে collect
পদ্ধতির সাথে পরিবর্তনীয় হ্রাস ব্যবহার করতে হবে ।