溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

jdk1.8為什么使用lambda表達(dá)式

發(fā)布時(shí)間:2021-08-25 10:47:06 來(lái)源:億速云 閱讀:129 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容主要講解“jdk1.8為什么使用lambda表達(dá)式”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“jdk1.8為什么使用lambda表達(dá)式”吧!

目錄
  • 一、為什么使用Lambda表達(dá)式

  • 二、匿名內(nèi)部類的方式與Lambda表達(dá)式方式的比較(示例)

  • 三、需求演示示例

    • 一、創(chuàng)建一個(gè)員工實(shí)體類

    • 二、普通方式實(shí)現(xiàn)

      • 1、代碼如下

      • 2、運(yùn)行main函數(shù),輸出結(jié)果如下圖:

      • 3、 普通方式實(shí)現(xiàn)的缺點(diǎn)

    • 三、優(yōu)化方式一(策略模式實(shí)現(xiàn))

      • 1、定義一個(gè)策略接口

      • 2、定義一個(gè)過(guò)濾年齡的接口實(shí)現(xiàn)類

      • 3、定義一個(gè)過(guò)濾薪資的接口實(shí)現(xiàn)類

      • 4、測(cè)試類如下:

      • 5、運(yùn)行main函數(shù),輸出如下:

      • 6、 策略模式實(shí)現(xiàn)的缺點(diǎn)

    • 四、優(yōu)化方式二(匿名內(nèi)部類實(shí)現(xiàn))

      • 1、定義一個(gè)策略接口

      • 2、測(cè)試類如下:

      • 3、運(yùn)行main函數(shù),輸出如下:

    • 五、優(yōu)化方式三(Lambda實(shí)現(xiàn))

      • 1、定義一個(gè)策略接口

      • 2、測(cè)試類如下:

      • 3、運(yùn)行main函數(shù),輸出如下:

    • 六、優(yōu)化方式四(Stream API和Lambda表達(dá)式實(shí)現(xiàn))

      • 1、代碼如下:

      • 2、運(yùn)行main函數(shù),輸出結(jié)果如下:


一、為什么使用Lambda表達(dá)式

Lambda是一個(gè)匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)??梢詫懗龈?jiǎn)潔、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使java的語(yǔ)言表達(dá)能力得到了提升。

二、匿名內(nèi)部類的方式與Lambda表達(dá)式方式的比較(示例)

場(chǎng)景:比較2個(gè)數(shù),一種采用內(nèi)部類的方式,一種采用lambda表達(dá)式的方式;如下圖:

jdk1.8為什么使用lambda表達(dá)式

三、需求演示示例

場(chǎng)景演示:獲取員工年齡小于35的員工信息,然后再獲取員工工資大于5000的員工信息。

一、創(chuàng)建一個(gè)員工實(shí)體類

package com.xz.springboot_java8.day1.entity;
/**
 * @description:
 * @author: xz
 * @create: 2021-08-23 21:07
 */
public class Employee {
    private int id;//id
    private String name;//名稱
    private int age;//年齡
    private Double salary; //薪水
		//無(wú)參構(gòu)造方法
    public Employee() { }
		//帶參構(gòu)造方法
    public Employee(int id, String name, int age, Double salary) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.salary = salary;
    }
	 //getter、setter、及toString方法此處省略
	 ........
}

二、普通方式實(shí)現(xiàn)

1、代碼如下
package com.xz.springboot_java8.day1.test;
import com.xz.springboot_java8.day1.entity.Employee;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @description:普通方式實(shí)現(xiàn)
 *              員工年齡小于35的員工信息和員工工資大于5000的員工信息。
 *              
 * @author: xz
 * @create: 2021-08-23 21:10
 */
public class Test1 {
    public static void main(String[] args) {
        //初始化員工數(shù)據(jù)并轉(zhuǎn)成list
        List<Employee> emps = Arrays.asList(
                new Employee(1, "張三", 18, 2222.22),
                new Employee(2, "李四", 25, 3333.33),
                new Employee(3, "王五", 38, 5555.55),
                new Employee(4, "趙六", 45, 8888.88)
        );
        //調(diào)用年齡小于35的員工信息方法
        List<Employee> list = filterEmployeeAge(emps);
        for (Employee employee : list) {
            System.out.println(employee);
        }
        System.out.println("============================");
        //調(diào)用工資大于5000的員工信息方法
        List<Employee> list1 = filterEmployeeSalary(emps);
        for (Employee employee : list1) {
            System.out.println(employee);
        }
    }
    /**
     * 獲取公司中年齡小于 35 的員工信息
     * @param emps
     * @return
     */
    public static List<Employee> filterEmployeeAge(List<Employee> emps){
        List<Employee> list = new ArrayList<>();
        for (Employee emp : emps) {
            if(emp.getAge() <= 35){
                list.add(emp);
            }
        }
        return list;
    }
    /**
     * 獲取公司中工資大于 5000 的員工信息
     * @param emps
     * @return
     */
    public static List<Employee> filterEmployeeSalary(List<Employee> emps){
        List<Employee> list = new ArrayList<>();
        for (Employee emp : emps) {
            if(emp.getSalary() >= 5000){
                list.add(emp);
            }
        }
        return list;
    }
}
2、運(yùn)行main函數(shù),輸出結(jié)果如下圖:

jdk1.8為什么使用lambda表達(dá)式

3、 普通方式實(shí)現(xiàn)的缺點(diǎn)

每新增一個(gè)新的需求就要重新寫一個(gè)方法,方法中只有判斷邏輯部分不同,其他都相同,出現(xiàn)代碼冗余。如下圖:

jdk1.8為什么使用lambda表達(dá)式

三、優(yōu)化方式一(策略模式實(shí)現(xiàn))

1、定義一個(gè)策略接口
package com.xz.springboot_java8.day1.test2;
/**
 * 定義一個(gè)策略接口
 */
public interface MyStrategy<T> {
    //該方法默認(rèn)為public abstract修飾
    public abstract boolean getEmployeeInfo(T t);
}
2、定義一個(gè)過(guò)濾年齡的接口實(shí)現(xiàn)類
package com.xz.springboot_java8.day1.test2;
import com.xz.springboot_java8.day1.entity.Employee;
/**
 * @description: 定義一個(gè)過(guò)濾年齡的接口實(shí)現(xiàn)類
 * @author: xz
 * @create: 2021-08-23 21:24
 */
public class FilterEmployeeAge implements MyStrategy<Employee>{
    @Override
    public boolean getEmployeeInfo(Employee employee) {
        return employee.getAge() <= 35;
    }
}
3、定義一個(gè)過(guò)濾薪資的接口實(shí)現(xiàn)類
package com.xz.springboot_java8.day1.test2;
import com.xz.springboot_java8.day1.entity.Employee;
/**
 * @description:  定義一個(gè)過(guò)濾薪資的接口實(shí)現(xiàn)類
 * @author: xz
 * @create: 2021-08-23 21:35
 */
public class FilterEmployeeSalary implements MyStrategy<Employee>{
    @Override
    public boolean getEmployeeInfo(Employee employee) {
        return employee.getSalary() >= 5000;
    }
}
4、測(cè)試類如下:
package com.xz.springboot_java8.day1.test2;
import com.xz.springboot_java8.day1.entity.Employee;
import java.util.*;
/**
 * @description: 策略模式實(shí)現(xiàn)
 *               員工年齡小于35的員工信息和員工工資大于5000的員工信息。
 * @author: xz
 * @create: 2021-08-23 11:21
 */
public class test {
    public static void main(String[] args) {
        //初始化員工數(shù)據(jù)并轉(zhuǎn)成list
        List<Employee> emps = Arrays.asList(
                new Employee(1, "張三", 18, 2222.22),
                new Employee(2, "李四", 25, 3333.33),
                new Employee(3, "王五", 38, 5555.55),
                new Employee(4, "趙六", 45, 8888.88)
        );
        //調(diào)用年齡小于35的員工信息方法
        List<Employee> list = getEmployee(emps,new FilterEmployeeAge());
        for (Employee employee : list) {
            System.out.println(employee);
        }
        System.out.println("------------------------");
        //調(diào)用調(diào)用工資大于5000的員工信息方法
        List<Employee> list1 = getEmployee(emps,new FilterEmployeeSalary());
        for (Employee employee : list1) {
            System.out.println(employee);
        }
    }
    /**
     * @param list 需要傳入員工信息
     * @param strategy 需要傳入具體策略
     */
    public static List<Employee> getEmployee(List<Employee> list,MyStrategy<Employee> strategy){
        List<Employee> empList = new ArrayList<>();
        for(Employee emp:list){
            if(strategy.getEmployeeInfo(emp)){
                empList.add(emp);
            }
        }
        return empList;
    }
}
5、運(yùn)行main函數(shù),輸出如下:

jdk1.8為什么使用lambda表達(dá)式

6、 策略模式實(shí)現(xiàn)的缺點(diǎn)

每新增一個(gè)新的需求就要重新寫一個(gè)實(shí)現(xiàn)策略接口的實(shí)現(xiàn)類,類圖如下:

jdk1.8為什么使用lambda表達(dá)式

四、優(yōu)化方式二(匿名內(nèi)部類實(shí)現(xiàn))

1、定義一個(gè)策略接口
package com.xz.springboot_java8.day1.test2;
/**
 * 定義一個(gè)策略接口
 */
public interface MyStrategy<T> {
    //該方法默認(rèn)為public abstract修飾
    public abstract boolean getEmployeeInfo(T t);
}
2、測(cè)試類如下:
package com.xz.springboot_java8.day1.test3;
import com.xz.springboot_java8.day1.entity.Employee;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @description: 匿名內(nèi)部類實(shí)現(xiàn)
 *               員工年齡小于35的員工信息和員工工資大于5000的員工信息。
 * @author: xz
 * @create: 2021-08-23 21:58
 */
public class Test {
    public static void main(String[] args) {
        //初始化員工數(shù)據(jù)并轉(zhuǎn)成list
        List<Employee> emps = Arrays.asList(
                new Employee(1, "張三", 18, 2222.22),
                new Employee(2, "李四", 25, 3333.33),
                new Employee(3, "王五", 38, 5555.55),
                new Employee(4, "趙六", 45, 8888.88)
        );
        //調(diào)用年齡小于35的員工信息方法(匿名內(nèi)部類的方式)
        List<Employee> list = getEmployee(emps, new MyStrategy<Employee>(){
            @Override
            public boolean getEmployeeInfo(Employee employee) {
                return employee.getAge()  <= 35;
            }
        });
        for (Employee employee : list) {
            System.out.println(employee);
        }
        System.out.println("------------------------");
        //調(diào)用調(diào)用工資大于5000的員工信息方法(匿名內(nèi)部類的方式)
        List<Employee> list1 = getEmployee(emps, new MyStrategy<Employee>(){
            @Override
            public boolean getEmployeeInfo(Employee employee) {
                return employee.getSalary() >= 5000;
            }
        });
        for (Employee employee : list1) {
            System.out.println(employee);
        }
    }
   /**
     * @param list 需要傳入員工信息
     * @param strategy 需要傳入具體策略
     */
    public static List<Employee> getEmployee(List<Employee> list, MyStrategy<Employee> strategy){
        List<Employee> empList = new ArrayList<>();
        for(Employee emp:list){
            if(strategy.getEmployeeInfo(emp)){
                empList.add(emp);
            }
        }
        return empList;
    }
}
3、運(yùn)行main函數(shù),輸出如下:

jdk1.8為什么使用lambda表達(dá)式

五、優(yōu)化方式三(Lambda實(shí)現(xiàn))

1、定義一個(gè)策略接口
package com.xz.springboot_java8.day1.test2;
/**
 * 定義一個(gè)策略接口
 */
public interface MyStrategy<T> {
    //該方法默認(rèn)為public abstract修飾
    public abstract boolean getEmployeeInfo(T t);
}
2、測(cè)試類如下:
package com.xz.springboot_java8.day1.test4;
import com.xz.springboot_java8.day1.entity.Employee;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @description: Lambda實(shí)現(xiàn)
 *               員工年齡小于35的員工信息和員工工資大于5000的員工信息。
 * @author: xz
 * @create: 2021-08-23 22:10
 */
public class Test {
    public static void main(String[] args) {
        //初始化員工數(shù)據(jù)并轉(zhuǎn)成list
        List<Employee> emps = Arrays.asList(
                new Employee(1, "張三", 18, 2222.22),
                new Employee(2, "李四", 25, 3333.33),
                new Employee(3, "王五", 38, 5555.55),
                new Employee(4, "趙六", 45, 8888.88)
        );
        //調(diào)用年齡小于35的員工信息方法(Lambda表達(dá)式實(shí)現(xiàn))
        List<Employee> list = getEmployee(emps, (e) -> e.getAge() <= 35);
        for (Employee employee : list) {
            System.out.println(employee);
        }
        System.out.println("------------------------");
        //調(diào)用調(diào)用工資大于5000的員工信息方法(Lambda表達(dá)式實(shí)現(xiàn))
        List<Employee> list1 = getEmployee(emps, (e) -> e.getSalary() >= 5000);
        for (Employee employee : list1) {
            System.out.println(employee);
        }
    }
    /**
     * 獲取條件過(guò)濾后的員工信息
     * @param list 需要傳入員工信息
     * @param strategy 需要傳入具體策略
     */
    public static List<Employee> getEmployee(List<Employee> list, MyStrategy<Employee> strategy){
        List<Employee> empList = new ArrayList<>();
        for(Employee emp:list){
            if(strategy.getEmployeeInfo(emp)){
                empList.add(emp);
            }
        }
        return empList;
    }
}
3、運(yùn)行main函數(shù),輸出如下:

jdk1.8為什么使用lambda表達(dá)式

六、優(yōu)化方式四(Stream API和Lambda表達(dá)式實(shí)現(xiàn))

1、代碼如下:
package com.xz.springboot_java8.day1.test5;
import com.xz.springboot_java8.day1.entity.Employee;
import java.util.Arrays;
import java.util.List;
/**
 * @description:
 *              員工年齡小于35的員工信息和員工工資大于5000的員工信息。
 * @author: xz
 * @create: 2021-08-23 22:18
 */
public class Test {
    public static void main(String[] args) {
        //初始化員工數(shù)據(jù)并轉(zhuǎn)成list
        List<Employee> emps = Arrays.asList(
                new Employee(1, "張三", 18, 2222.22),
                new Employee(2, "李四", 25, 3333.33),
                new Employee(3, "王五", 38, 5555.55),
                new Employee(4, "趙六", 45, 8888.88)
        );
        //調(diào)用年齡小于35的員工信息方法(Lambda表達(dá)式實(shí)現(xiàn))
        emps.stream()
                .filter((e)->e.getAge() <= 35)
                .forEach(System.out::println);
        System.out.println("=======================");
        //調(diào)用調(diào)用工資大于5000的員工信息方法(Lambda表達(dá)式實(shí)現(xiàn))
        emps.stream()
                .filter((e)->e.getSalary() >= 5000)
                .forEach(System.out::println);
    }
}
2、運(yùn)行main函數(shù),輸出結(jié)果如下:

jdk1.8為什么使用lambda表達(dá)式

到此,相信大家對(duì)“jdk1.8為什么使用lambda表達(dá)式”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI