一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達(dá)式
一、為什么使用Lambda表達(dá)式
Lambda是一個匿名函數(shù),我們可以把Lambda表達(dá)式理解為是一段可以傳遞的代碼(將代碼像數(shù)據(jù)一樣進(jìn)行傳遞)??梢詫懗龈啙?、更靈活的代碼。作為一種更緊湊的代碼風(fēng)格,使java的語言表達(dá)能力得到了提升。
二、匿名內(nèi)部類的方式與Lambda表達(dá)式方式的比較(示例)
場景:比較2個數(shù),一種采用內(nèi)部類的方式,一種采用lambda表達(dá)式的方式;如下圖:
三、需求演示示例
場景演示:獲取員工年齡小于35的員工信息,然后再獲取員工工資大于5000的員工信息。
一、創(chuàng)建一個員工實體類
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方法此處省略 ........ }
二、普通方式實現(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:普通方式實現(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、 普通方式實現(xiàn)的缺點
每新增一個新的需求就要重新寫一個方法,方法中只有判斷邏輯部分不同,其他都相同,出現(xiàn)代碼冗余。如下圖:
三、優(yōu)化方式一(策略模式實現(xiàn))
1、定義一個策略接口
package com.xz.springboot_java8.day1.test2; /** * 定義一個策略接口 */ public interface MyStrategy<T> { //該方法默認(rèn)為public abstract修飾 public abstract boolean getEmployeeInfo(T t); }
2、定義一個過濾年齡的接口實現(xiàn)類
package com.xz.springboot_java8.day1.test2; import com.xz.springboot_java8.day1.entity.Employee; /** * @description: 定義一個過濾年齡的接口實現(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、定義一個過濾薪資的接口實現(xiàn)類
package com.xz.springboot_java8.day1.test2; import com.xz.springboot_java8.day1.entity.Employee; /** * @description: 定義一個過濾薪資的接口實現(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: 策略模式實現(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、 策略模式實現(xiàn)的缺點
每新增一個新的需求就要重新寫一個實現(xiàn)策略接口的實現(xiàn)類,類圖如下:
四、優(yōu)化方式二(匿名內(nèi)部類實現(xiàn))
1、定義一個策略接口
package com.xz.springboot_java8.day1.test2; /** * 定義一個策略接口 */ 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)部類實現(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實現(xiàn))
1、定義一個策略接口
package com.xz.springboot_java8.day1.test2; /** * 定義一個策略接口 */ 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實現(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á)式實現(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á)式實現(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á)式實現(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á)式實現(xiàn)) emps.stream() .filter((e)->e.getAge() <= 35) .forEach(System.out::println); System.out.println("======================="); //調(diào)用調(diào)用工資大于5000的員工信息方法(Lambda表達(dá)式實現(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)文章
解決spring boot hibernate 懶加載的問題
這篇文章主要介紹了解決spring boot hibernate 懶加載的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-10-10非maven項目快速轉(zhuǎn)換為maven項目的方法步驟
時候我們導(dǎo)入的項目并不是有maven來管理依賴的,而是要手動添加jar包,比較麻煩,本文主要介紹了非maven項目快速轉(zhuǎn)換為maven項目的方法步驟,具有一定的參考價值,感興趣的可以了解一下2024-01-01java 關(guān)鍵字static詳細(xì)介紹及如何使用
這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下2017-03-03在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程
這篇文章主要介紹了在IDEA中配置tomcat并創(chuàng)建tomcat項目的圖文教程,需要的朋友可以參考下2020-07-07