Eran এর উত্তর দুই ARG এবং তিন ARG এর সংস্করণের মধ্যে পার্থক্য বর্ণনা reduce
যে সাবেক হ্রাস Stream<T>
করার T
যেহেতু আধুনিক হ্রাস Stream<T>
করার U
। যাইহোক, এটি হ্রাস Stream<T>
করার সময় অতিরিক্ত সংযুক্তকারী ফাংশনের প্রয়োজনীয়তাটি আসলে ব্যাখ্যা করে না U
।
স্ট্রিমস এপিআই এর একটি ডিজাইনের মূলনীতি হ'ল এপিআই ক্রমিক এবং সমান্তরাল স্ট্রিমগুলির মধ্যে পৃথক হওয়া উচিত নয় বা অন্য কোনও উপায়ে বলা উচিত, কোনও নির্দিষ্ট এপিআই ধারাবাহিকভাবে বা সমান্তরালভাবে কোনও স্ট্রিমকে সঠিকভাবে চলমান থেকে আটকাবে না। যদি আপনার ল্যাম্বডাসের সঠিক বৈশিষ্ট্য থাকে (সহযোগী, অ-হস্তক্ষেপ, ইত্যাদি) ধারাবাহিকভাবে বা সমান্তরালে একটি স্ট্রিম চালানো একই ফলাফল দেওয়া উচিত।
আসুন প্রথমে হ্রাসের দ্বি-আরগ সংস্করণটি বিবেচনা করুন:
T reduce(I, (T, T) -> T)
অনুক্রমিক বাস্তবায়ন সোজা ward I
ফলাফল দেওয়ার জন্য জেরোথ স্ট্রিম উপাদানটির সাথে পরিচয় মান "সঞ্চিত" হয়। এই ফলাফলটি প্রথম স্ট্রিম উপাদানটির সাথে আরও একটি ফলাফল দেওয়ার জন্য সঞ্চিত হয়, যার ফলস্বরূপ দ্বিতীয় স্ট্রিম উপাদানটির সাথে জমে থাকে এবং আরও সামনে। শেষ উপাদানটি জমা হওয়ার পরে, চূড়ান্ত ফলাফলটি ফিরে আসে।
সমান্তরাল বাস্তবায়নটি প্রবাহকে বিভাগগুলিতে বিভক্ত করে শুরু হয়। প্রতিটি বিভাগটি উপরে বর্ণিত ক্রমিক ফ্যাশনে তার নিজস্ব থ্রেড দ্বারা প্রক্রিয়াজাত করা হবে। এখন, যদি আমাদের এন থ্রেড থাকে তবে আমাদের এন মধ্যবর্তী ফলাফল রয়েছে। এগুলি একটি ফলকে হ্রাস করতে হবে। যেহেতু প্রতিটি মধ্যবর্তী ফলাফল টি টাইপযুক্ত, এবং আমাদের বেশ কয়েকটি রয়েছে, আমরা সেই জাতীয় মধ্যবর্তী ফলাফলগুলি একক ফলাফলকে হ্রাস করতে একই সংযোজক ফাংশনটি ব্যবহার করতে পারি।
এখন একটি প্রকল্পিত দুই ARG হ্রাস অপারেশন যে হ্রাস বিবেচনা করা যাক Stream<T>
করতে U
। অন্যান্য ভাষায়, এটিকে "ভাঁজ" বা "ভাঁজ-বাম" অপারেশন বলা হয় তাই আমি এখানে এটি ডাকব। নোট করুন এটি জাভাতে নেই।
U foldLeft(I, (U, T) -> U)
(মনে রাখবেন যে পরিচয় মানটি I
ইউ টাইপের)
এর ক্রমিক সংস্করণটি foldLeft
ঠিক এর ক্রমিক সংস্করণটির মতো যা reduce
অন্তর্বর্তী মানগুলি টাইপ টির পরিবর্তে ইউ টাইপের হয় তবে এটি অন্যথায় একই রকম। (একটি অনুমানমূলক foldRight
অপারেশন একই রকম হবে ব্যতীত অপারেশনগুলি বাম-থেকে-ডান পরিবর্তে ডান থেকে বামে সঞ্চালিত হবে))
এখন এর সমান্তরাল সংস্করণ বিবেচনা করুন foldLeft
। স্ট্রিমটিকে বিভাগগুলিতে বিভক্ত করে শুরু করা যাক। তারপরে আমরা প্রতিটি এন থ্রেড এর বিভাগে টি মানগুলি কম করে ইউ টাইপের এন মধ্যবর্তী মানগুলিতে পরিণত করতে পারি Now এখন কি? আমরা টাইপ ইউ এর এন মানগুলি থেকে কীভাবে ইউ টাইপের একক ফলাফল পেতে পারি?
কি অনুপস্থিত অন্য ফাংশন যে সম্মিলন টাইপ ইউ একটি একক ফলাফলের টাইপ ইউ একাধিক মধ্যবর্তী ফলাফল যদি আমরা একটি ফাংশন যে এক সম্মিলন দুই ইউ মূল্যবোধ, বানানোর জন্য যথেষ্ট এর এক নিচে মূল্যবোধের কোন সংখ্যা কমাতে আছে - ঠিক উপরে মূল হ্রাস। সুতরাং, হ্রাস অপারেশন যা একটি ভিন্ন ধরণের ফলাফল দেয় দুটি ফাংশন প্রয়োজন:
U reduce(I, (U, T) -> U, (U, U) -> U)
বা, জাভা সিনট্যাক্স ব্যবহার করে:
<U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
সংক্ষেপে বলা যায়, একটি ভিন্ন ফলাফলের ধরনের সমান্তরাল হ্রাস করতে, আমরা দুই ফাংশন প্রয়োজন: এক যে accumulates অন্তর্বর্তী ইউ মান টি উপাদান, এবং দ্বিতীয় যে সম্মিলন একটি একক ইউ ফলাফলের মধ্যে অন্তর্বর্তী ইউ মান। যদি আমরা প্রকারগুলি স্যুইচ না করে থাকি তবে দেখা যায় যে সংযোজক ফাংশনটি কম্বিনার ফাংশনের মতো the একারণে একই ধরণের হ্রাস কেবল সংযোজক ফাংশন এবং একটি ভিন্ন ধরণের হ্রাস পৃথক সঞ্চয়ী এবং সংযুক্তকারী ফাংশন প্রয়োজন।
পরিশেষে, জাভা সরবরাহ করে না foldLeft
এবং foldRight
অপারেশন করে না কারণ তারা বোঝায় যে ক্রিয়াকলাপগুলি সহজাত ক্রমযুক্ত operations ক্রমগত এবং সমান্তরাল ক্রিয়াকলাপকে সমানভাবে সমর্থন করে এমন APIs সরবরাহ করার উপরে উপরে বর্ণিত নকশার নীতিটির সাথে এই সংঘর্ষ।