亚欧色一区w666天堂,色情一区二区三区免费看,少妇特黄A片一区二区三区,亚洲人成网站999久久久综合,国产av熟女一区二区三区

  • 發布文章
  • 消息中心
點贊
收藏
評論
分享
原創

深入理解java8新特性

2023-02-24 03:13:30
17
0

關于java8新特性的理解

·速度更快  

·代碼更少(增加了新的語法Lambda表達式)--核心

·Stream API   --- 核心

·便于并行

·最大化減少空指針異常Optional


Lambda表達式--匿名函數(一段可以傳遞的代碼)

為什么需要Lambda表達式?

·在過去的Java中,我們無法將函數作為參數傳遞給一個方法,也無法聲明返回一個函數的方法

·同時,在JavaScript中,函數的參數可以是一個函數,返回值也可以是另一個函數,這種情況十分常見,JavaScript是一門非常典型的函數式語言

 我們可以看下關于匿名內部類使用lambda表達式和之前的對比

 

//原來的匿名內部類
public void test1() {
    Comparator<Integer> com = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2);
        }
    };
    TreeSet<Integer> ts = new TreeSet<>(com);
}

//Lambda表達式
public void test2() {
    Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
    TreeSet<Integer> ts = new TreeSet<>(com);
}
 

&nbsp;可以看(kan)到(dao)使用Lambda表達式(shi)后代(dai)碼的簡潔性和(he)可讀性都得到(dao)了提高

 

接下來我(wo)們通過一(yi)個實例來更近一(yi)步了解lambda表達式(shi)

定義一(yi)個(ge)員工(gong)實(shi)體類,我們(men)的需求(qiu)是通過(guo)不同的條件來過(guo)濾得到員工(gong)信息

public class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public Employee() {
    }

    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 getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}

//向集合中添加元素
List<Employee> employees = Arrays.asList(
        new Employee("張三", 18, 6000),
        new Employee("李四", 21, 2000),
        new Employee("孫悟空", 35, 8000),
        new Employee("豬八戒", 40, 100000),
        new Employee("唐僧", 55, 3000),
        new Employee("孫悟飯(fan)", 18, 7000)

);
//需求:獲取當前公司中員工年齡大于35的員工信息
public List<Employee> filterEmployee(List<Employee> list) {
    List<Employee> emps = new ArrayList&lt;>();

    for (Employee emp : list) {  //遍歷list 如果大于35 就存入 emps
        if (emp.getAge() >= 35) {
            emps.add(emp);
        }
    }
    return emps;
}
//需求:獲取員工工資大于5000的員工信息
public  List<Employee> filterEmployee2(List<Employee> list){
    List<Employee> emps = new ArrayList<>();

    for (Employee emp : list) {  //遍歷list 如果大于35 就存入 emps
        if (emp.getSalary() >= 5000) {
            emps.add(emp);
        }
    }
    return emps;
}
可以看到,這樣的代碼十分冗余,而且耦合度過高,我們的本質要面向接口編程,
在一般(ban)情況下(xia)我們使(shi)用(yong)(yong)設計模(mo)式來進行代碼優(you)化(本例中使(shi)用(yong)(yong)策略(lve)模(mo)式)

首先定義一個MyPredicate接口,定義返回布爾類型的方法
public interface MyPredicate<T> {
    public boolean test(T t);
}
定義接口的實現類FilterEmployeeByAge
public class FilterEmployeeByAge implements MyPredicate<Employee> {
    @Override
  &nbsp; public boolean test(Employee employee) {

        return employee.getAge() >= 35;
    }
}
定義接口的實現類FilterEmployeeBySalary 
public class FilterEmployeeBySalary implements MyPredicate<Employee> {
    @Override
    public boolean test(Employee employee) {
        return employee.getSalary() >= 5000;
    }
}

具體實現方法
//優化方式一  倆個參數  一個所有員工信息的集合   一個條件判斷的集合
public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> mp) {
    List<Employee> emps = new ArrayList<>();
    for (Employee employee : list
    ) {
        if (mp.test(employee)) {
            emps.add(employee);
        }
    }
    return emps;
}
//測試方法
@Test
public void Test4() {
    List<Employee> list = filterEmployee(employees, new FilterEmployeeByAge());
    for (Employee employee : list
    ) {
        System.out.println(employee);
    }

    List<Employee> list2 = filterEmployee(employees, new FilterEmployeeByAge());
    for (Employee employee : list2
    ) {
        System.out.println(employee);
    }
}
1.我們可以看到,在具體實現中代碼量減少,而且符合了開閉原則(對修改關閉,對擴展開放),
如果需要增加新的需求,只需要新增接口的實現類即可。
2.實際上,我們可以看到這種優化方式的缺點:就是每次新增需求都需要定義新的實現類,有些多余,
實際上我們可以繼續優化,通過使用匿名內部類來減少代碼
 
//優化方式2 匿名內部類
@Test
public void test5() {
    List<Employee> list = filterEmployee(employees, new MyPredicate<Employee>() {
        @Override
        public boolean test(Employee employee) {
            return employee.getSalary() <= 5000;
        }
    });
    for (Employee employee : list
    ) {
        System.out.println(employee);
    }
}
1.我們可以看到,匿名內部類的本質就是在客戶端(測試方法)中直接創建接口的實現類,
省去了單獨創建實現類的麻煩。
2.但是實際上匿名內部類的寫法依然代碼冗余,可讀性較低,我們可以采用lambda表達式來進一步優化
 
//優化方式三 lambda 表達式
@Test
public void test6() {
    List<Employee> list = filterEmployee(employees, (e) -> e.getSalary() <= 5000);
    list.forEach(System.out::println);
}
1.實際上,lambda表達式本真就是匿名函數,又進一步簡化了匿名內部類的寫法,這里的箭頭個人感覺與JavaScript中一樣,
畢竟JavaScript是典型的函數式語言,但是無論是匿名內部類還是lambda表達式,都只是在客戶端中進行了優化,
就是省去了單獨創建實現類的工作,將單獨創建實現類改為了在客戶端(測試方法)中創建。
2.但是本質上他們都需要依賴filterEmployee(List<Employee> list, MyPredicate<Employee> mp)方法來完成需求,
我們采用stream可以直接完成需求
 
//優化方式4 Stream
@Test
public void test7() {
    employees.stream()
            .filter((e) -> e.getSalary() >= 5000)
            .forEach(System.out::println);
}


通過 流Stream這種新的集合運算和表達的高階抽象,使用效果嘆為觀止,極大的簡化了代碼,
引(yin)用官(guan)方的(de)一句話(hua),Stream API可以極大提高(gao)(gao)Java程序員(yuan)的(de)生(sheng)產力,讓(rang)程序員(yuan)寫出高(gao)(gao)效率、干(gan)凈、簡潔的(de)代碼(ma)。

0條評論
0 / 1000
嘎嘎嘎嘎
15文(wen)章(zhang)數
0粉絲(si)數(shu)
嘎嘎嘎嘎
15 文章 | 0 粉(fen)絲
嘎嘎嘎嘎
15文章數
0粉絲數
嘎嘎嘎嘎
15 文章(zhang) | 0 粉(fen)絲
原創

深入理解java8新特性

2023-02-24 03:13:30
17
0

關于java8新特性的理解

·速度更快  

·代碼更少(增加了新的語法Lambda表達式)--核心

·Stream API   --- 核心

·便于并行

·最大化減少空指針異常Optional


Lambda表達式--匿名函數(一段可以傳遞的代碼)

為什么需要Lambda表達式?

·在過去的Java中,我們無法將函數作為參數傳遞給一個方法,也無法聲明返回一個函數的方法

·同時,在JavaScript中,函數的參數可以是一個函數,返回值也可以是另一個函數,這種情況十分常見,JavaScript是一門非常典型的函數式語言

 我們可以看下關于匿名內部類使用lambda表達式和之前的對比

 

//原來的匿名內部類
public void test1() {
    Comparator<Integer> com = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return Integer.compare(o1, o2);
        }
    };
    TreeSet<Integer> ts = new TreeSet<>(com);
}

//Lambda表達式
public void test2() {
    Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
    TreeSet<Integer> ts = new TreeSet<>(com);
}
 

 可(ke)(ke)以看到使(shi)用(yong)Lambda表(biao)達式后代碼的簡潔性和可(ke)(ke)讀性都得(de)到了提(ti)高(gao)

 

接(jie)下來(lai)我(wo)們通過(guo)一個實例來(lai)更(geng)近一步了解(jie)lambda表達式

定義一個員工(gong)實體類,我(wo)們的需求是通(tong)過(guo)不同的條件來(lai)過(guo)濾得到員工(gong)信息

public class Employee {
    private String name;
    private int age;
    private double salary;

    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public Employee() {
    }

    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 getSalary() {
        return salary;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", salary=" + salary +
                '}';
    }
}

//向集合中添加元素
List<Employee> employees = Arrays.asList(
        new Employee("張三", 18, 6000),
        new Employee("李四", 21, 2000),
        new Employee("孫悟空", 35, 8000),
        new Employee("豬八戒", 40, 100000),
        new Employee("唐僧", 55, 3000),
        new Employee("孫悟飯", 18, 7000)

);
//需求:獲取當前公司中員工年齡大于35的員工信息
public List<Employee> filterEmployee(List<Employee> list) {
    List<Employee> emps = new ArrayList<>();

    for (Employee emp : list) {  //遍歷list 如果大于35 就存入 emps
        if (emp.getAge() >= 35) {
            emps.add(emp);
        }
    }
    return emps;
}
//需求:獲取員工工資大于5000的員工信息
public  List<Employee> filterEmployee2(List<Employee> list){
&nbsp;   List&lt;Employee> emps = new ArrayList<>();

    for (Employee emp : list) {  //遍歷list 如果大于35 就存入 emps
        if (emp.getSalary() >= 5000) {
            emps.add(emp);
        }
    }
    return emps;
}
可以看到,這樣的代碼十分冗余,而且耦合度過高,我們的本質要面向接口編程,
在一般(ban)情況下我們使用(yong)設計模式來進行代(dai)碼(ma)優(you)化(本例中使用(yong)策略模式)

首先定義一個MyPredicate接口,定義返回布爾類型的方法
public interface MyPredicate<T> {
    public boolean test(T t);
}
定義接口的實現類FilterEmployeeByAge
public class FilterEmployeeByAge implements MyPredicate<Employee> {
    @Override
    public boolean test(Employee employee) {

        return employee.getAge() >= 35;
    }
}
定義接口的實現類FilterEmployeeBySalary 
public class FilterEmployeeBySalary implements MyPredicate<Employee> {
    @Override
    public boolean test(Employee employee) {
        return employee.getSalary() >= 5000;
    }
}

具體實現方法
//優化方式一  倆個參數  一個所有員工信息的集合   一個條件判斷的集合
public List<Employee> filterEmployee(List<Employee> list, MyPredicate<Employee> mp) {
    List<Employee> emps = new ArrayList<>();
    for (Employee employee : list
    ) {
        if (mp.test(employee)) {
            emps.add(employee);
        }
    }
    return emps;
}
//測試方法
@Test
public void Test4() {
    List<Employee> list = filterEmployee(employees, new FilterEmployeeByAge());
    for (Employee employee : list
    ) {
        System.out.println(employee);
    }

    List<Employee> list2 = filterEmployee(employees, new FilterEmployeeByAge());
    for (Employee employee : list2
    ) {
        System.out.println(employee);
    }
}
1.我們可以看到,在具體實現中代碼量減少,而且符合了開閉原則(對修改關閉,對擴展開放),
如果需要增加新的需求,只需要新增接口的實現類即可。
2.實際上,我們可以看到這種優化方式的缺點:就是每次新增需求都需要定義新的實現類,有些多余,
實際上我們可以繼續優化,通過使用匿名內部類來減少代碼
 
//優化方式2 匿名內部類
@Test
public void test5() {
    List<Employee> list = filterEmployee(employees, new MyPredicate<Employee>() {
        @Override
        public boolean test(Employee employee) {
            return employee.getSalary() <= 5000;
        }
    });
    for (Employee employee : list
    ) {
        System.out.println(employee);
    }
}
1.我們可以看到,匿名內部類的本質就是在客戶端(測試方法)中直接創建接口的實現類,
省去了單獨創建實現類的麻煩。
2.但是實際上匿名內部類的寫法依然代碼冗余,可讀性較低,我們可以采用lambda表達式來進一步優化
 
//優化方式三 lambda 表達式
@Test
public void test6() {
    List<Employee> list = filterEmployee(employees, (e) -> e.getSalary() <= 5000);
    list.forEach(System.out::println);
}
1.實際上,lambda表達式本真就是匿名函數,又進一步簡化了匿名內部類的寫法,這里的箭頭個人感覺與JavaScript中一樣,
畢竟JavaScript是典型的函數式語言,但是無論是匿名內部類還是lambda表達式,都只是在客戶端中進行了優化,
就是省去了單獨創建實現類的工作,將單獨創建實現類改為了在客戶端(測試方法)中創建。
2.但是本質上他們都需要依賴filterEmployee(List<Employee> list, MyPredicate<Employee> mp)方法來完成需求,
我們采用stream可以直接完成需求
 
//優化方式4 Stream
@Test
public void test7() {
    employees.stream()
            .filter((e) -> e.getSalary() >= 5000)
            .forEach(System.out::println);
}


通過 流Stream這種新的集合運算和表達的高階抽象,使用效果嘆為觀止,極大的簡化了代碼,
引用官方的(de)一(yi)句話,Stream API可以極大提高Java程序員的(de)生產力,讓程序員寫出(chu)高效(xiao)率(lv)、干凈(jing)、簡潔的(de)代(dai)碼。

文章來自個人專欄
文章 | 訂(ding)閱
0條評論
0 / 1000
請輸入你的評論
1
1