最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達(dá)式

 更新時(shí)間:2021年08月25日 09:46:49   作者:小志的博客  
Lambda是一個(gè)匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段可以傳遞的代碼,本篇文章就帶你了解,希望能給你帶來幫助

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

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

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

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

在這里插入圖片描述

三、需求演示示例

場景演示:獲取員工年齡小于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; //薪水
		//無參構(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é)果如下圖:

在這里插入圖片描述

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

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

在這里插入圖片描述

三、優(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è)過濾年齡的接口實(shí)現(xiàn)類

package com.xz.springboot_java8.day1.test2;
import com.xz.springboot_java8.day1.entity.Employee;
/**
 * @description: 定義一個(gè)過濾年齡的接口實(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è)過濾薪資的接口實(shí)現(xiàn)類

package com.xz.springboot_java8.day1.test2;
import com.xz.springboot_java8.day1.entity.Employee;
/**
 * @description:  定義一個(gè)過濾薪資的接口實(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、測試類如下:

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ù),輸出如下:

在這里插入圖片描述

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

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

在這里插入圖片描述

四、優(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、測試類如下:

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ù),輸出如下:

在這里插入圖片描述

五、優(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、測試類如下:

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);
        }
    }
    /**
     * 獲取條件過濾后的員工信息
     * @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ù),輸出如下:

在這里插入圖片描述

六、優(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é)果如下:

在這里插入圖片描述

四、示例演示總結(jié)

由以上優(yōu)化示例可知,lambda表達(dá)式可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)并且可以寫出更簡潔、更靈活的代碼。

總結(jié)

本篇文章就到這里了,希望能給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • SpringBoot過濾器的使用

    SpringBoot過濾器的使用

    過濾器是對數(shù)據(jù)進(jìn)行過濾,預(yù)處理過程,當(dāng)我們訪問網(wǎng)站時(shí),有時(shí)候會發(fā)布一些敏感信息,發(fā)完以后有的會用*替代,還有就是登陸權(quán)限控制等,一個(gè)資源,沒有經(jīng)過授權(quán),肯定是不能讓用戶隨便訪問的,這個(gè)時(shí)候,也可以用到過濾器,需要的朋友可以參考一下
    2021-11-11
  • 手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉庫

    手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉庫

    本文主要介紹了手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉庫,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Spring中ApplicationContextAware的使用方法詳解

    Spring中ApplicationContextAware的使用方法詳解

    ApplicationContextAware?通過它Spring容器會自動把上下文環(huán)境對象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,這篇文章主要介紹了Spring中ApplicationContextAware的作用,需要的朋友可以參考下
    2023-03-03
  • Java數(shù)據(jù)庫連接PreparedStatement的使用詳解

    Java數(shù)據(jù)庫連接PreparedStatement的使用詳解

    這篇文章主要介紹了Java數(shù)據(jù)庫連接PreparedStatement的使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-08-08
  • springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟

    springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟

    這篇文章主要介紹了springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-05-05
  • 用java開發(fā)dota英雄最華麗的技能(實(shí)例講解)

    用java開發(fā)dota英雄最華麗的技能(實(shí)例講解)

    下面小編就為大家分享一篇使用java開發(fā)dota英雄最華麗的技能實(shí)例,具有非常好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-11-11
  • IDEA必備開發(fā)神器之EasyCode

    IDEA必備開發(fā)神器之EasyCode

    對于java程序員來說,日常工作中就是crud的操作,每次都要搭建MVC三層,還是很繁瑣,這里就出現(xiàn)了神器easycode的工具.可以快速生成代碼.并且還可以自定義模板.需要的朋友可以參考下
    2021-05-05
  • 詳解Spring AOP自定義可重復(fù)注解沒有生效問題

    詳解Spring AOP自定義可重復(fù)注解沒有生效問題

    本文主要介紹了Spring AOP自定義可重復(fù)注解沒有生效問題,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 關(guān)于使用ContextClassLoader遇到的問題

    關(guān)于使用ContextClassLoader遇到的問題

    這篇文章主要介紹了關(guān)于使用ContextClassLoader遇到的問題,ContextClassLoader是通過Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下
    2023-10-10
  • Java Email郵件發(fā)送簡單實(shí)現(xiàn)介紹

    Java Email郵件發(fā)送簡單實(shí)現(xiàn)介紹

    電子郵件從用戶電腦的郵件軟件,例如Outlook,發(fā)送到郵件服務(wù)器上,可能經(jīng)過若干個(gè)郵件服務(wù)器的中轉(zhuǎn),最終到達(dá)對方郵件服務(wù)器上,收件方就可以用軟件接收郵件
    2022-11-11

最新評論

石阡县| 疏附县| 宿迁市| 华亭县| 桃园市| 周至县| 托克逊县| 明光市| 大田县| 西青区| 天峻县| 皋兰县| 神农架林区| 道孚县| 株洲市| 稷山县| 永善县| 长乐市| 错那县| 宜昌市| 宁河县| 德兴市| 库车县| 祁门县| 米易县| 隆林| 廉江市| 涿州市| 太湖县| 博乐市| 嵊泗县| 仁布县| 晋城| 昌乐县| 习水县| 报价| 临海市| 陆川县| 萨迦县| 中西区| 嘉善县|