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


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  

 

 

سپاسگزاریم که همراه ما هستید

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

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

 


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


مشخصات دوره


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

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