نکات کلیدی
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 بسیاری از مفاهیم برنامهنویسی تابعی را معرفی میکند، همچنان سازگاری با گذشته و یک منحنی یادگیری تدریجیتر را نسبت به رویکرد جامعتر برنامهنویسی تابعی اسکالا حفظ میکند.
آخرین بهروزرسانی::
FAQ
What’s Java 8 in Action about?
- Focus on Java 8 Features: Java 8 in Action by Raoul-Gabriel Urma explores the significant changes introduced in Java 8, such as lambdas, streams, and functional programming.
- Practical Examples: The book includes practical examples and exercises to help readers apply these new features in real-world scenarios.
- Evolution of Java: It discusses the evolution of Java and the importance of these changes for modern programming practices.
Why should I read Java 8 in Action?
- Enhance Programming Skills: The book helps Java developers upgrade their skills with the latest features in Java 8, making them more proficient.
- Comprehensive Guide: It serves as a comprehensive guide with clear explanations, suitable for both beginners and experienced programmers.
- Stay Updated: Understanding Java 8 is crucial for staying relevant in the evolving tech landscape, and this book ensures you are up-to-date.
What are the key takeaways of Java 8 in Action?
- Lambdas and Streams: Learn how to use lambda expressions and the Streams API for writing concise and efficient Java code.
- Behavior Parameterization: The book emphasizes writing flexible and reusable code through behavior parameterization.
- Functional Programming Concepts: Gain insights into integrating functional programming techniques into Java.
How does Java 8 in Action explain lambda expressions?
- Concise Syntax: Lambda expressions provide a concise way to represent anonymous functions, allowing code to be passed as arguments.
- Functional Interfaces: They are used in the context of functional interfaces, which define a single abstract method that the lambda implements.
- Type Inference: Java compiler infers parameter types in lambda expressions, making the code cleaner and more readable.
What is the Streams API in Java 8 in Action?
- Data Processing: The Streams API processes sequences of elements in a functional style, supporting operations like filtering, mapping, and reducing.
- Lazy Evaluation: Streams are evaluated lazily, performing computations only when necessary, which can improve performance.
- Parallel Processing: The API supports parallel processing, allowing developers to leverage multicore processors efficiently.
How does Java 8 in Action address Optional types?
- Avoiding Nulls: The Optional class represents optional values without using null references, preventing NullPointerExceptions.
- Clearer API Design: Using Optionals indicates when a value may be absent, improving code readability and maintainability.
- Functional Operations: Methods like map, flatMap, and orElse are used to work with Optionals in a functional style.
What is behavior parameterization in Java 8 in Action?
- Definition: Behavior parameterization allows passing blocks of code as parameters to methods, enabling flexible behavior.
- Real-World Examples: The book illustrates this with examples like filtering and sorting collections, adapting to changing requirements.
- Improved Code Flexibility: This approach creates methods that are more adaptable and easier to maintain.
How can I implement asynchronous programming with CompletableFuture in Java 8 in Action?
- Creating CompletableFutures: Use the supplyAsync method to run tasks asynchronously, useful for non-blocking operations.
- Chaining Operations: Chain asynchronous operations with methods like thenApply and thenCompose for a declarative programming style.
- Error Handling: Handle errors with methods like handle and exceptionally, ensuring graceful management of exceptions.
What are some best practices for using streams in Java 8 in Action?
- Prefer Internal Iteration: Use streams for internal iteration, simplifying code and allowing potential parallel processing.
- Avoid Side Effects: Ensure lambdas in streams are stateless and avoid modifying external variables to maintain clarity.
- Use Method References: Leverage method references for cleaner code when passing existing methods as arguments in streams.
How does Java 8 in Action explain the significance of CompletableFuture?
- Asynchronous Programming: CompletableFuture is a tool for handling asynchronous programming, allowing non-blocking code.
- Composing Tasks: Compose multiple asynchronous tasks with methods like thenCompose and thenCombine for managing workflows.
- Error Handling: The book covers handling exceptions in asynchronous computations, crucial for robust applications.
What are the differences between parallel streams and CompletableFutures in Java 8 in Action?
- Parallel Streams: Designed for processing collections in parallel, best for compute-bound tasks with evenly distributed workloads.
- CompletableFutures: More flexible for asynchronous programming, handling I/O-bound tasks without blocking.
- Use Cases: Parallel streams are ideal for data processing, while CompletableFutures excel in managing asynchronous tasks and dependencies.
What are the best quotes from Java 8 in Action and what do they mean?
- "NullPointerException is by far the most common exception in Java.": Highlights the need for better practices like using Optional to avoid null references.
- "Lambda expressions can make your code more readable and flexible.": Emphasizes the benefit of lambdas in simplifying code and enabling behavior parameterization.
- "Functional programming is about writing code that is easier to reason about.": Underlines the core benefit of functional programming—reducing complexity and improving maintainability.
نقد و بررسی
کتاب جاوا 8 در عمل به خاطر پوشش جامع ویژگیهای جاوا 8، بهویژه لامبداها و استریمها، مورد تحسین قرار گرفته است. خوانندگان از توضیحات روشن، مثالهای عملی و بینشهای ارائهشده در زمینه برنامهنویسی تابعی قدردانی میکنند. بسیاری این کتاب را برای بهروزرسانی دانش جاوا و پر کردن فاصله بین نسخههای قدیمی و جاوای مدرن مفید میدانند. تمرکز کتاب بر روی جاوا 8 هم بهعنوان یک نقطه قوت و هم بهعنوان یک نقطه ضعف مطرح میشود، زیرا برخی از محتوا با انتشار نسخههای جدیدتر جاوا قدیمی میشود. با این حال، این کتاب همچنان بهعنوان منبعی بسیار توصیهشده برای توسعهدهندگان جاوا که به دنبال ارتقاء درک خود از مفاهیم برنامهنویسی تابعی و ویژگیهای جاوا 8 هستند، باقی میماند.
Similar Books






