تا الان در این آموزش خواندهاید که کاهش یک استریم شامل تجمع عناصر آن است، به روشی که شبیه زبان SQL به نظر میرسد. در مثالهایی که اجرا کردید، عناصر استریمهای ساختهشده را با الگوی collect(Collectors.toList()) جمعآوری کردید. تمام این عملیاتها عملیاتهای پایانی در Stream API نامیده میشوند و شامل کاهش استریم شما هستند.
دو نکته هنگام فراخوانی عملیات پایانی روی یک استریم باید به یاد داشته باشید.
IllegalStateException دریافت خواهید کرد.سه overload متد reduce() در رابط Stream تعریف شده. همه یک شیء BinaryOperator به عنوان آرگومان میگیرند. بیایید بررسی کنیم این binary operator چگونه استفاده میشود.
فرض کنید لیستی از اعداد صحیح دارید و باید مجموع آنها را محاسبه کنید. میتوانید کد زیر را برای محاسبهی این مجموع با استفاده از الگوی حلقهی for کلاسیک بنویسید.
sum = 12
آنچه این کد انجام میدهد به صورت زیر است:
[دیاگرام: Summing the Elements of a Stream]
اگر این کد را دقیق بررسی کنید، میبینید میتوانید عملگر SUM را با یک binary operator مدلسازی کنید تا نتیجهی مشابهی بگیرید.
sum = 12
اکنون میبینید این کد فقط به binary operator بستگی دارد. اگر MAX نیاز دارید، کافی است binary operator صحیح ارائه دهید.
max = 6
نتیجهگیری این است که واقعاً میتوانید یک کاهش را فقط با ارائهی یک binary operator که روی دو عنصر عمل میکند محاسبه کنید. این دقیقاً نحوهی کار reduce() در Stream API است.
دو نکتهی مهم وجود دارد.
نکته اول: خاصیت Associativity
استریم میتواند به صورت موازی محاسبه شود. منبع داده به دو بخش تقسیم میشود، هر بخش جداگانه با همان binary operator پردازش و سپس نتایج جزئی با همان binary operator ادغام میشوند.
[دیاگرام: Summing Elements of a Stream in Parallel]
نحوهی تقسیم عناصر نباید بر نتیجهی محاسبه تأثیر بگذارد. تمام تقسیمبندیهای زیر باید نتیجهی یکسانی بدهند:
3 + (6 + 2 + 1)(3 + 6) + (2 + 1)(3 + 6 + 2) + 1این نشان میدهد binary operator باید خاصیت Associativity داشته باشد.
نکته دوم: خاصیت Associativity به نتیجهی دیگری نیز منجر میشود. اگر مجموعه A را به دو زیرمجموعه B و C تقسیم کنید، کاهش A باید نتیجهی ادغام کاهش B و کاهش C باشد.
A = B ⋃ C ⇒ Red(A) = Red(Red(B), Red(C))
اگر B خالی باشد: Red(A) = Red(Red(∅), Red(A)). این درست است اگر و فقط اگر کاهش مجموعهی خالی (∅) عنصر همانی عملیات کاهش باشد.
مشکل واقعی: برخی binary operator های کاهش کلاسیک مانند MIN و MAX عنصر همانی ندارند.
انتخاب Stream API: کاهشی که عنصر همانی آن نامعلوم است یک نمونه از Optional برمیگرداند.
اولین overload عنصر همانی و نمونهای از BinaryOperator میگیرد.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: https://dev.java/learn/