一篇文章帶你了解jdk1.8新特性--為什么使用lambda表達(dá)式
一、為什么使用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á)式的方式;如下圖:

三、需求演示示例
場(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é)果如下圖:

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

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

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

六、優(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ǎn)潔、更靈活的代碼。
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉(cāng)庫(kù)
本文主要介紹了手?jǐn)]一個(gè)Spring?Boot?Starter并上傳到Maven中央倉(cāng)庫(kù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05
Spring中ApplicationContextAware的使用方法詳解
ApplicationContextAware?通過(guò)它Spring容器會(huì)自動(dòng)把上下文環(huán)境對(duì)象調(diào)用ApplicationContextAware接口中的setApplicationContext方法,這篇文章主要介紹了Spring中ApplicationContextAware的作用,需要的朋友可以參考下2023-03-03
Java數(shù)據(jù)庫(kù)連接PreparedStatement的使用詳解
這篇文章主要介紹了Java數(shù)據(jù)庫(kù)連接PreparedStatement的使用詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟
這篇文章主要介紹了springboot+gradle 構(gòu)建多模塊項(xiàng)目的步驟,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05
用java開發(fā)dota英雄最華麗的技能(實(shí)例講解)
下面小編就為大家分享一篇使用java開發(fā)dota英雄最華麗的技能實(shí)例,具有非常好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
詳解Spring AOP自定義可重復(fù)注解沒(méi)有生效問(wèn)題
本文主要介紹了Spring AOP自定義可重復(fù)注解沒(méi)有生效問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
關(guān)于使用ContextClassLoader遇到的問(wèn)題
這篇文章主要介紹了關(guān)于使用ContextClassLoader遇到的問(wèn)題,ContextClassLoader是通過(guò)Thread.currentThread().getContextClassLoader()返回該線程上下文的ClassLoader,需要的朋友可以參考下2023-10-10
Java Email郵件發(fā)送簡(jiǎn)單實(shí)現(xiàn)介紹
電子郵件從用戶電腦的郵件軟件,例如Outlook,發(fā)送到郵件服務(wù)器上,可能經(jīng)過(guò)若干個(gè)郵件服務(wù)器的中轉(zhuǎn),最終到達(dá)對(duì)方郵件服務(wù)器上,收件方就可以用軟件接收郵件2022-11-11

