آموزش جامع Stream در جاوا (بخش دوم)
جلسات دوره
مهدی عباسی
مهدی عباسی هستم، مسلط به حداقل ۲۰ زبان مطرح برنامه نویسی به صورت پیشرفته، مدیر عامل شرکت آریا نرم افزار و بنیانگذار آکادمی درسمن، مسلط به تدریس دروس تخصصی کاردانی و کارشناسی کامپیوتر، پایگاه داده ها، برنامه نویسی پیشرفته، مبانی برنامه نویسی، مباحث ویژه طراحی وب و .... مشاهده رزومه
آموزش جامع Stream در جاوا (بخش دوم)
در جلسه گذشته با Stream آشنا شدیم در این جلسه میخواهیم روی کلاس های model از Stream استفاده کنیم.
یک کلاس به نام Person میسازیم و همچنین تابع compareTo را در کلاس اضافه میکنیم.
public class Person implements Comparable<Person> {
private String name;
private int age;
private double avg;
public Person(String name, int age, double avg) {
this.name = name;
this.age = age;
this.avg = avg;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
", avg=" + avg +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getAvg() {
return avg;
}
public void setAvg(double avg) {
this.avg = avg;
}
@Override
public int compareTo(Person person2) {
return this.getName().compareTo(person2.getName());
}
}
حال یک لیست از کلاس Person درون کلاس Main تعریف میکنیم و در ادامه با Stream ها کار میکنیم.
List<Person> people=new ArrayList<>();
people.add(new Person("mehdi",34,15.6));
people.add(new Person("reza",26,17.4));
people.add(new Person("ali",32,16.3));
حال میخواهیم با استفاده از استریم Person یک واحد به معدل کسانی که سن بالای 30 دارند اضافه کنیم و درون یک List نگهداری کنیم.
List<Person> list2= people.stream()
.filter(person->person.getAge()>30)
.map(person -> person.getAvg()+1)
.collect(Collectors.toList());
کد بالا با خطا موجه میشود. خروجی اپراتور map از نوع double است و نمیتوان لیستی از double را درون لیستی از Person ها نگهداری کرد. برای حل مشکل باید در اپراتور map داده را به Person تبدیل کنیم، که برابر با کد زیر است:
List<Person> list2= people.stream()
.filter(person->person.getAge()>30)
.map(person ->new Person(person.getName(),person.getAge(),person.getAvg()+1))
.collect(Collectors.toList());
for(Person person:list2){
System.out.println(person);
}
خروجی
Person{name='mehdi', age=34, avg=16.6}
Person{ name='ali', age=32, avg=17.3}
اپراتور reduce
زمانی که میخواهیم داده ها را کاهش دهیم یا رفتاری روی تمام داده ها انجام دهیم از این اپراتور استفاده میکنیم. این اپراتور دو پارامتر دریافت میکند پارامتر اول مقدار اولیه داده است و پارامتر دوم یک لامبدا برای محاسبات دریافت میکند.
به عنوان مثال میخواهیم جمع اعداد زوج درون لیست را به وسیله Stream محاسبه کنیم.
ArrayList<Integer> numbers=new ArrayList<>(Arrays.asList(23,45,78,2,3,790,467));
int sum=numbers.stream()
.filter(t->t%2==0)
.reduce(0,(x,y)->x+y);
System.out.println(sum);
خروجی
870
در مثال زیر میخواهیم ضرب اعدادی که با 2 شروع می شوند را بدست بیاوریم.
ArrayList<Integer> numbers=new ArrayList<>(Arrays.asList(23,45,78,2,3,790,467,25));
int mul=numbers.stream()
.filter(t->t.toString().startsWith("2"))
.reduce(1,(x,y)->x*y);
System.out.println(mul);
خروجی
1150
نحوه تبدیل Map ها به استریم
برای تبدیل Map ها به استریم باید ابتدا Map به entrySet تبدیل کنیم و سپس روی entrySet استریم را انجام دهیم.
میخواهیم عناصر Map را با استفاده از استریم ها مرتب کنیم.
Map<Integer,String> map1=new HashMap<>();
map1.put(10,"ali");
map1.put(2,"reza");
map1.put(13,"mehdi");
map1.put(4,"ali reza");
map1.entrySet().stream()
.sorted(Map.Entry.comparingByValue())
.forEach(entry-> System.out.println(entry.getKey()+ " : "+entry.getValue()));
خروجی
نکته: برای مرتب سازی Map باید در پارامتر ورودی اپراتور Sorted مشخص کنید بر اساس key یا value مرتب سازی را انجام داد:
- Map.Entry.comparingByKey(): مرتب سازی بر حسب key
- Map.Entry.comparingByValue(): مرتب سازی بر حسب value
سپاسگزاریم که همراه ما هستید
امیدواریم که این آموزش مورد توجه شما دوستان عزیز قرار گرفته باشد و بتواند شما را در راه رسیدن به اهدافتان کمک کند. برای دسترسی بیشتر به جلسات این دوره از آموزش جاوا پیشرفته کلیک کنید.
خوشحال میشویم هر گونه پیشنهاد یا انتقادی دراین زمینه بود برای ما در قسمت نظرات ارسال کنید.
نظر شما در تصمیم دیگران اثرگذار است.
لطفا برای همراهان درسمن و بهتر شدن دوره نظر خود را بنویسید.