پایان Lambda
در سری مقالات آموزش جاوا, به مفاهیم پایانی Lambda میپردازیم.
تا اینجا عمده مفاهیم مرتبط با lambda را بررسی کردیم. در این مقاله نیز مفاهیم باقی مانده را مورد بررسی قرار میدهیم و سری مقالات lambda را به پایان میرسانیم.
در java ۸ یک متد به باقی متد های لیست اضافه شده است. این متد از Lambda استفاده میکند و تمام المان های درون لیست را بررسی میکند.
default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
همانطور که در کد تشکیل دهنده این متد مشخص است, یک Functional Interface به عنوان ورودی دریافت میکند و متدی که به عنوان پارامتر به آن ارسال میشود را اجرا میکند. همانطور که در مقالات قبل اشاره شد, Consumer یک ورودی دریافت میکند و خروجی ندارد. این نوع رفتار برای انجام تغییرات و یا نمایش مقادیر لیست مناسب است.
List<User> users = Arrays.asList(user.apply("Vahid"), user.apply("Ali"), user.apply("Amir"), user.apply("Mohammad"), user.apply("Moein"), user.apply("Kazem")); users.forEach(p-> System.out.println(p.getUsername()));
در این مثال یک لیست ایجاد شده است و در یک حلقه تکرار, مقادیر متد username در خروجی نمایش داده میشوند. این رفتار کاملا مشابه رفتار enhance for است
for (User user : users) { System.out.println(user.getUsername()); }
گاهی مقادیر لیست مستقل از تغییرات هستند و تنها میخواهیم از آنها استفاده کنیم. در اینجا میتوان از Method Reference ها استفاده کنیم
users.forEach(System.out::println);
به این ترتیب تمام مقادیر درون لیست را چاپ میکند اما اگر مقادیر به تغییرات نیاز داشته باشند و یا برای فراخوانی متدی در آنها, باید از lambda expression استفاده شود.
مبحث مهم بعدی در lambda در مورد Stream است. به دنباله ای از المان های یک آرایه که پردازش های متوالی و همروند روی آن ها صورت بگیرد را Stream گویند. برای مثال فرض کنید یک خط تولید صفحه نمایش وجود دارد که سه ناظر بر ساخت این محصول نظارت دارند. یکی از ناظر ها موظف به بررسی سلامت ظاهری صفحه نمایش است. ناظر بعدی موظف است تا روشن شدن صفحه نمایش را بررسی کند و ناظر آخر بررسی میکند که وسایل جانبی همراه این نمایشگر باشد. میتوان خط تولید به این صورت رفتار کند که ابتدا تمام صفحه نمایش ها تولید شوند و هر ناظر بررسی خود را انجام دهد و سپس کار را به ناظر بعدی بسپارد. اما این روش سربار زیادی را به همراه خواهد داشت. برای رفع این مشکل یک ناظر در ابتدا, یک ناظر در وسط و ناظر آخر در انتهای خط تولید قرار میگیرند. به این ترتیبهر صفحه نمایش پس از بررسی به ناظر دیگر فرستاده می شود, درحالی که ناظر فعلی درحال بررسی نمایشگر دیگری است. Stream ها نیز به همین روش عمل میکنند. در واقع چندین پردازش با توالی و همروندی در آنها انجام میشود.
برای درک بهتر stream چند مثال را با استفاده از متد های آن مینویسم. در مقالات قبل نام هایی که با حرف a شروع میشدند را در خروجی چاپ کردیم. با استفاده از stream میتوان کد را به این صورت تغییر داد
public static void main(String[] args) { Function<String, User> user = User::new; List<User> users = Arrays.asList(user.apply("Vahid"), user.apply("Ali"), user.apply("Amir"), user.apply("Mohammad"), user.apply("Moein"), user.apply("Kazem")); users.stream().filter(Names::isValid).forEach(System.out::println); } public static boolean isValid(User s) { return (s.getUsername().toLowerCase().startsWith("a")); }
در کد بالا, متد filter یک Predicate Interface را به عنوان ورودی دریافت میکند و نگهدارنده شرط است. همانطور که در مقالات قبل اشاره شد Predicate یک متغیر را به عنوان دستور شرط دریافت میکند و نتیجه را به صورت boolean بر میگرداند. در نهایت نتیجه Stream که به صورت یک لیست است را با استفاده از foreach چاپ کرده ایم.
اگر بخواهیم مقادیر تکراری را از یک لیست حذف کنیم میتوان به این صورت عمل کرد
List<String> users = Arrays.asList("Vahid", "Ali", "Ali", "Mohammad", "Moein", "Kazem"); users.stream().distinct().forEach(System.out::println);
درکد بالا متد distinct مقادیر تکراری را از لیست حذف میکند. اگر بخواهیم تغییری در مقادیر لیست بوجود آوریم به این صورت میتوان عمل کرد
List<String> users = Arrays.asList("Vahid", "Ali", "Amir", "Mohammad", "Moein", "Kazem"); users.stream().map(i -> "Welcome " + i).forEach(System.out::println);
متد Map مقادیر را به مقدار مورد نظر تغییر میدهد. همچنین متد هایی مانند sorted برای مرتب سازی و limit برای محدود کردن تعداد لیست در Stream وجود دارد. لیست کامل متد ها و همچنین توضیحات Stream Interface را میتوانید از اینجا مشاهده کنید.
سری مقالات آموزش Lambda به پایان رسیده است اما سری مقالات آموزش جاوا همچنان ادامه دارد.
با ما همراه باشید.
دیدگاهتان را بنویسید
برای نوشتن دیدگاه باید وارد بشوید.