آموزش جامع 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 شروع شده باشد.
یادگیری این دوره تنها با یک جلسه به پایان نمیرسد و شما میتوانید با تهیه این درس و سایر دروس ارائه شده در این دوره، به طور کامل به مباحث جاوا پیشرفته تسلط پیدا کنید.
شما درسمنی های عزیز هر گونه سوال یا ابهامی از این جلسه داشتید میتوانید به انجمن برنامه نویسان جاوا مراجعه کنید و سوالات خود را بپرسید.
ممنون از همراهی شما
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.