نکات کلیدی
1. جاوا 8 معرفی میکند عبارات لامبدا و رابطهای تابعی برای کد مختصر و انعطافپذیر
عبارات لامبدا میتوانند کد شما را خواناتر و انعطافپذیرتر کنند.
نحو مختصر. عبارات لامبدا راهی برای انتقال رفتار به عنوان یک آرگومان متد فراهم میکنند، که منجر به کدی انعطافپذیرتر و قابل استفاده مجدد میشود. این عبارات در واقع توابع ناشناس هستند که میتوانند در هر جایی که یک رابط تابعی مورد انتظار است، استفاده شوند. رابطهای تابعی، رابطهایی با یک متد انتزاعی هستند، مانند Predicate، Function و Consumer.
خوانایی بهبود یافته. با استفاده از عبارات لامبدا، میتوانید کدی بیانگرتر و خواناتر بنویسید. به عنوان مثال، به جای کلاسهای داخلی ناشناس پرحجم، میتوانید از نحو فشرده لامبدا استفاده کنید:
- قبل: new Comparator<Apple>() { public int compare(Apple a1, Apple a2) { return a1.getWeight().compareTo(a2.getWeight()); } }
- بعد: (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight())
ارجاعات متد. جاوا 8 همچنین ارجاعات متد را به عنوان یک نشانهگذاری کوتاه برای لامبداهایی که به سادگی یک متد موجود را فراخوانی میکنند، معرفی میکند. این امر خوانایی و قابلیت استفاده مجدد کد را بیشتر بهبود میبخشد.
2. API استریمها پردازش دادهها به صورت اعلامی و موازی را ممکن میسازد
استریمها میتوانند به صورت موازی پردازش شوند، بدون اینکه نیازی به نوشتن کد چندنخی داشته باشید!
برنامهنویسی اعلامی. API استریمها به شما اجازه میدهد تا پرسشهای پیچیده پردازش دادهها را به صورت اعلامی بیان کنید. به جای نوشتن چگونگی انجام عملیات به صورت گام به گام، شما توصیف میکنید که چه چیزی میخواهید به دست آورید. این منجر به کدی مختصرتر و خواناتر میشود.
موازیسازی. استریمها به راحتی میتوانند موازی شوند تا از پردازندههای چند هستهای بهرهبرداری کنند. با تغییر ساده stream() به parallelStream()، میتوانید به طور بالقوه عملکرد را بدون تغییر منطق کد خود بهبود بخشید.
ارزیابی تنبل. عملیات استریم به صورت تنبل ارزیابی میشوند، به این معنی که محاسبه بر روی دادههای منبع تنها زمانی انجام میشود که عملیات نهایی آغاز شود. این میتواند منجر به بهبودهای قابل توجهی در عملکرد شود، به ویژه هنگام کار با مجموعه دادههای بزرگ.
عملیات کلیدی استریم شامل موارد زیر است:
- میانی: filter، map، flatMap، distinct، sorted، limit
- نهایی: forEach، count، collect، reduce، find، match
3. متدهای پیشفرض در رابطها اجازه میدهند تکامل API بدون شکستن پیادهسازیهای موجود
متدهای پیشفرض به طراحان کتابخانه کمک میکنند تا APIها را به صورت سازگار با گذشته تکامل دهند.
تکامل API. متدهای پیشفرض به شما اجازه میدهند تا متدهای جدیدی به رابطها اضافه کنید بدون اینکه پیادهسازیهای موجود را بشکنید. این ویژگی عمدتاً برای تکامل API مجموعههای جاوا معرفی شد، که امکان افزودن متدهای جدید مانند stream() به رابطهای موجود را فراهم میکند.
وراثت چندگانه رفتار. با متدهای پیشفرض، جاوا اکنون از یک فرم محدود از وراثت چندگانه رفتار پشتیبانی میکند. رابطها میتوانند کد پیادهسازی ارائه دهند، نه فقط امضای متدها.
قوانین حل تعارض. هنگامی که یک کلاس چندین رابط با متدهای پیشفرض متعارض را پیادهسازی میکند، جاوا 8 قوانین حل تعارض واضحی ارائه میدهد:
- کلاسها همیشه برنده میشوند بر رابطها
- رابطهای خاصتر بر رابطهای کمتر خاص برتری دارند
- اگر هنوز تعارضی وجود داشته باشد، کلاس باید به صراحت متد را بازنویسی کند
4. کلاس Optional بهبود مدیریت null و طراحی API
استفاده از Optional میتواند به شما کمک کند تا APIهای بهتری طراحی کنید که با خواندن امضای یک متد، کاربران میتوانند تشخیص دهند که آیا باید انتظار یک مقدار اختیاری را داشته باشند.
جایگزین null. کلاس Optional راه بهتری برای نمایش عدم وجود یک مقدار فراهم میکند، به جای استفاده از ارجاعات null. این امر به جلوگیری از NullPointerExceptions کمک میکند و کد را خواناتر میسازد.
طراحی API. با استفاده از Optional در امضای متدها، شما به صراحت اعلام میکنید که ممکن است یک مقدار غایب باشد. این منجر به طراحی بهتر API میشود و کاربران را مجبور میکند تا به حالتی که یک مقدار وجود ندارد، توجه کنند.
Optional چندین متد برای مدیریت ایمن ارائه میدهد:
- isPresent() برای بررسی وجود یک مقدار
- ifPresent(Consumer<T>) برای اجرای یک عمل اگر یک مقدار وجود داشته باشد
- orElse(T) برای ارائه یک مقدار پیشفرض
- orElseGet(Supplier<T>) برای ارائه تنبل یک مقدار پیشفرض
- map(Function<T,U>) و flatMap(Function<T,Optional<U>>) برای تبدیلها
5. API جدید تاریخ و زمان به کاستیهای کلاسهای تاریخ/زمان قبلی میپردازد
اشیاء تاریخ-زمان API جدید تاریخ و زمان همگی غیرقابل تغییر هستند.
غیرقابل تغییر بودن. بسته جدید java.time کلاسهای تاریخ-زمان غیرقابل تغییر را معرفی میکند، که ایمن در برابر نخ هستند و از بسیاری از خطاهای برنامهنویسی رایج مرتبط با کلاسهای تاریخ-زمان قابل تغییر جلوگیری میکنند.
جداسازی نگرانیها. API به وضوح جدا میکند:
- زمان قابل خواندن توسط انسان (LocalDate، LocalTime، LocalDateTime)
- زمان ماشینی (Instant)
- مناطق زمانی (ZonedDateTime)
- دورههای زمانی (Duration، Period)
API روان. کلاسهای جدید یک API روان برای انجام عملیات ارائه میدهند، که دستکاری تاریخ و زمان را شهودیتر و کمتر مستعد خطا میسازد. به عنوان مثال:
LocalDate date = LocalDate.of(2023, Month.MAY, 15)
.plusDays(7)
.minusMonths(1);
6. CompletableFuture برنامهنویسی غیرهمزمان و واکنشی را تسهیل میکند
CompletableFuture به شما اجازه میدهد تا محاسبات غیرهمزمان پیچیده را به صورت اعلامی بیان کنید.
برنامهنویسی غیرهمزمان. CompletableFuture رابط Future را گسترش میدهد، و راهی برای انجام محاسبات غیرهمزمان و ترکیب نتایج آنها فراهم میکند. این امر به ویژه برای ساخت برنامههای پاسخگو و استفاده کارآمد از منابع سیستم مفید است.
ترکیبپذیری. CompletableFuture به شما اجازه میدهد تا چندین عملیات غیرهمزمان را زنجیره کنید، که بیان جریانهای کاری پیچیده را آسان میکند. متدهایی مانند thenApply، thenCompose و thenCombine به شما اجازه میدهند تا نتایج محاسبات غیرهمزمان را تبدیل و ترکیب کنید.
ویژگیهای کلیدی:
- عملیات غیرمسدودکننده
- مدیریت استثنا با متدهای exceptionally و handle
- توانایی ترکیب چندین آینده با allOf و anyOf
- پشتیبانی از مدیریت زمانبندی
7. مفاهیم برنامهنویسی تابعی بیانگری و نگهداریپذیری جاوا را افزایش میدهند
برنامهنویسی به سبک تابعی روشهای بدون اثر جانبی و برنامهنویسی اعلامی را ترویج میکند.
غیرقابل تغییر بودن. برنامهنویسی تابعی بر استفاده از ساختارهای داده غیرقابل تغییر تأکید دارد، که منجر به کدی پیشبینیپذیرتر و نگهداریپذیرتر میشود. در جاوا 8، این امر از طریق استفاده از متغیرهای نهایی و مجموعههای غیرقابل تغییر پشتیبانی میشود.
توابع مرتبه بالاتر. جاوا 8 امکان انتقال توابع به عنوان آرگومان و بازگرداندن آنها به عنوان نتایج را معرفی میکند، که انتزاعات قدرتمند و استفاده مجدد از کد را ممکن میسازد. این امر از طریق عبارات لامبدا و ارجاعات متد به دست میآید.
سبک اعلامی. برنامهنویسی تابعی یک سبک اعلامی از برنامهنویسی را تشویق میکند، جایی که شما توصیف میکنید که چه چیزی میخواهید به دست آورید، نه اینکه چگونه به آن دست یابید. این امر اغلب منجر به کدی مختصرتر و خواناتر میشود.
مفاهیم کلیدی برنامهنویسی تابعی در جاوا 8:
- توابع خالص (متدهای بدون اثرات جانبی)
- ترکیب توابع
- ارزیابی تنبل (همانطور که در API استریمها دیده میشود)
- بازگشت به عنوان جایگزینی برای تکرار
8. مقایسه با اسکالا قابلیتها و محدودیتهای برنامهنویسی تابعی جاوا 8 را برجسته میکند
اسکالا مجموعه بزرگتری از ویژگیها را در اطراف این ایدهها نسبت به جاوا 8 ارائه میدهد.
تفاوتهای نحوی. اسکالا نحو مختصرتری برای بسیاری از عملیاتها ارائه میدهد، مانند ایجاد و کار با مجموعهها. به عنوان مثال، ایجاد یک نقشه در اسکالا:
val authorsToAge = Map("Raoul" -> 23, "Mario" -> 40, "Alan" -> 53)
ویژگیهای پیشرفته تابعی. اسکالا ویژگیهای پیشرفتهتری از برنامهنویسی تابعی ارائه میدهد، از جمله:
- تطبیق الگو
- ارزیابی تنبل
- کرینگ
- ویژگیها (مشابه رابطهای جاوا اما با قابلیتهای بیشتر)
سیستم نوع. اسکالا دارای یک سیستم نوع پیشرفتهتر است، از جمله ویژگیهایی مانند:
- استنباط نوع
- انواع مرتبه بالاتر
- تبدیلهای ضمنی
در حالی که جاوا 8 بسیاری از مفاهیم برنامهنویسی تابعی را معرفی میکند، همچنان سازگاری با گذشته و یک منحنی یادگیری تدریجیتر را نسبت به رویکرد جامعتر برنامهنویسی تابعی اسکالا حفظ میکند.
آخرین بهروزرسانی::
نقد و بررسی
کتاب جاوا 8 در عمل به خاطر پوشش جامع ویژگیهای جاوا 8، بهویژه لامبداها و استریمها، مورد تحسین قرار گرفته است. خوانندگان از توضیحات روشن، مثالهای عملی و بینشهای ارائهشده در زمینه برنامهنویسی تابعی قدردانی میکنند. بسیاری این کتاب را برای بهروزرسانی دانش جاوا و پر کردن فاصله بین نسخههای قدیمی و جاوای مدرن مفید میدانند. تمرکز کتاب بر روی جاوا 8 هم بهعنوان یک نقطه قوت و هم بهعنوان یک نقطه ضعف مطرح میشود، زیرا برخی از محتوا با انتشار نسخههای جدیدتر جاوا قدیمی میشود. با این حال، این کتاب همچنان بهعنوان منبعی بسیار توصیهشده برای توسعهدهندگان جاوا که به دنبال ارتقاء درک خود از مفاهیم برنامهنویسی تابعی و ویژگیهای جاوا 8 هستند، باقی میماند.