آموزش جامع Stream در جاوا (بخش اول)


آموزش جامع Stream در جاوا
براي خريد اين درس نياز است وارد سايت شويد. در صورت نداشتن حساب کاربري عضو شويد.

آموزش جامع Stream در جاوا (بخش اول)

در این جلسه می خواهیم Api Stream را توضیح دهیم.

Api Stream از جاوای 8 به بعد اضافه شد و می‌تواند خیلی از فعالیت هایی که تا الان انجام می‌دادیم را سریع‌تر و ساده‌تر با امکانات بیشتر انجام دهد. در جلسات گذشته انواع ساختار داده را بررسی کردیم و اهمیت داده ها را درون برنامه درک کردیم. در این جلسه به کمک Api Stream می‌خواهیم حرکت روی داده ها و پردازش داده ها را با سرعت و کیفیت بالاتری انجام دهیم.

Stream ها تغییری بر داده ها ندارند یعنی زمانی که مجموعه ای از داده ها را Stream می‌کنیم، تغییری بر روی داده های اصلی انجام نمیشه و می‌توان چندین استفاده کنند همزمان به وسیله Stream به مجموعه داده متصل بشوند.

زمانی که مجموعه داده ای را Stream می‌کنیم می‌توان چندین اپراتور میانی(Intermediate Operations) و بعد از اپراتور میانی، اپراتور پایانی(Terminal Operations) که می‌تواند تحویل دهنده داده باشد را تعریف می‌کنیم.

نحوه تبدیل آرایه به استریم

برای تبدیل آرایه به استریم از متد stream درون کلاس Arrays استفاده می‌کنیم.

int[] a={1,23,45,5,17,67,89};

Arrays.stream(a);

متدهای کاربردی استریم

متد sum

این متد جمع آرایه را برمی‌گرداند.

int[] a={1,23,45,5,17,67,89};

System.out.println( Arrays.stream(a).sum());

خروجی

247

متد min

این متد کوچک ترین عنصر آرایه را برمی‌گرداند.

خروجی تابع min از کلاس OptionalInt است و برای تبدیل به int با استفاده از تابع getAsInt آن را به int تبدیل می‌کنیم.

int[] a={1,23,45,5,17,67,89};

System.out.println( Arrays.stream(a).min().getAsInt());

خروجی

1

متد max

این متد بزرگ ترین عنصر آرایه را برمی‌گرداند.

خروجی تابع max از کلاس OptionalInt است و برای تبدیل به int با استفاده از تابع getAsInt آن را به int تبدیل می‌کنیم.

int[] a={1,23,45,5,17,67,89};

System.out.println( Arrays.stream(a).max().getAsInt());

خروجی

89

متد average

این متد میانگین آرایه را برمی‌گرداند.

خروجی تابع average از کلاس OptionalDouble است و برای تبدیل به double با استفاده از تابع getAsDouble آن را به double تبدیل می‌کنیم.

int[] a={1,23,45,5,17,67,89};

System.out.println( Arrays.stream(a).average().getAsDouble());

خروجی

35.285714285714285

اپراتور میانی استریم (Intermediate Operations)

اپراتور map

این اپراتور برای تبدیل داده موجود به داده جدید استفاده می‌شود و در ورودی تابع با استفاده از ساختار لامبدا می‌توانیم دستورات مورد نظر را وارد کنیم. به عنوان مثال در زیر با استفاده از اپراتور map عنصر فعلی را در لحظه *10 می‌کنیم و با استفاده از اپراتور پایانی forEach هر عنصر را چاپ می‌کنیم.

int[] a={1,23,45,5,17,67,89};

Arrays.stream(a).map(x->x*10).forEach(item-> System.out.print(item+"\t"));

خروجی

10        230       450       50        170       670       890

اپراتور filter

این اپراتور با استفاده از ساختار لامبدا یک شرط دریافت می‌کند و عناصری که شرط را داشته باشند را برمی‌گرداند. در مثال زیر با استفاده از اپراتور filter گفتیم اعدادی که بزرگتر از 20 هستند را برگردان و سپس با اپراتور forEach عناصر را چاپ کردیم.

int[] a={1,23,45,5,17,67,89};

Arrays.stream(a).filter(t->t>20).forEach(item-> System.out.print(item+"\t"));

خروجی

23        45        67        89

اپراتور sorted

این اپراتور عناصر آرایه را مرتب می‌کند.

int[] a={1,23,45,5,17,67,89};

Arrays.stream(a).sorted().forEach(item-> System.out.print(item+"\t"));

خروجی

1          5          17        23        45        67        89

نحوه تبدیل کالکشن ها به استریم

برای تبدیل کالکشن به استریم نیاز به کلاس جانبی Arrays نیست و می‌توان مستقیم بعد از نام مجموعه، متد stream را صدا زد.

ArrayList<String> names=new ArrayList<>(

         Arrays.asList("ahmad","reza","mohammad","sahar","amir","mehdi","negin"));

names.stream();

همچنان مانند قبل تمامی متدها و اپراتورها بر روی کالکشن ها نیز قابل اجرا هستند.

اپراتور پایانی collect

زمانی که می‌خواهیم نتیجه Stream را نگه داری کنیم از این اپراتور استفاده می‌کنیم. این اپراتور به عنوان ورودی Collectors دریافت می‌کند. در مثال زیر ابتدا با استفاده از filter تمام عناصری که درون آنها m وجود دارد را انتخاب کردیم و با استفاده از اپراتور collect آن ها را به لیست تبدیل کردیم و درون یک شی از لیست نگهداری کردیم.

List<String> list1=names.stream().filter(t->t.contains("m")).collect(Collectors.toList());

System.out.println(list1);

خروجی

[mehdi, ahmad, mohammad, amir]

همچنین می‌توان چندین اپراتور را استفاده کرد به عنوان مثال می‌خواهیم ابتدا تمام عناصری که ابتدای آنها با m شروع شده است را حفظ کردیم و سپس ابتدا هر عنصر * و انتهای هر عنصر # را قرار دهیم و آنها را چاپ کنیم.

List<String> list2=names.stream()

                    .filter(name->name.startsWith("m"))

                    .map(name->"*"+name+"#")

                    .collect(Collectors.toList());

System.out.println(list2);

خروجی

[*mehdi#, *mohammad#]

نکته: ترتیب استفاده از اپراتورها اهمیت دارد به عنوان مثال اگر در مثال بالا ابتدا اپراتور map را انجام می‌دادیم و سپس filter خروجی برابر [] بود. به دلیل اینکه ابتدای هر عنصر * قرار گرفته و سپس در اپراتور filter گفتیم اولین کاراکتر عنصر با حرف m شروع شده باشد.

 

یادگیری این دوره تنها با یک جلسه به پایان نمی‌رسد و شما می‌توانید با تهیه این درس و سایر دروس ارائه شده در این دوره، به طور کامل به مباحث جاوا پیشرفته تسلط پیدا کنید.

 شما درسمنی های عزیز هر گونه سوال یا ابهامی از این جلسه داشتید می‌توانید به انجمن برنامه نویسان جاوا مراجعه کنید و سوالات خود را بپرسید.

ممنون از همراهی شما

 


نظر بدهید نظر شما در تصمیم دیگران اثرگذار است. لطفا برای ما و همراهان درسمن نظر خود را بنویسید.
برای ارسال نظر نیاز است وارد سایت شوید. در صورت نداشتن حساب کاربری عضو شوید.


مشخصات دوره


مدرس دوره : مهدی عباسی
تعداد جلسات : جلسه
مدت زمان : 1709 دقیقه
حجم دوره : 5/26 گیگابایت
سطح مهارت : پیشرفته
وضعیت دوره : درحال برگزاری
تعداد دانشجویان : 843
: میانگین امتیاز
برای دسترسی به این دوره وارد یا عضو شوید.
مهدی عباسی

مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی آنلاین درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و ....