作為語法糖,其實現(xiàn)邏輯分為三步:
第一步:有一個函數(shù)式接口(創(chuàng)建一個接口,包含一個未實現(xiàn)的方法);
第二步:有一個方法A,將接口作為A的形參;
第三步:顯示調(diào)用方法A,Lambda表達式作為實參代替第二步的形參,既完成了接口調(diào)用。
LAMBDA表達式需要函數(shù)式接口支持
格式:
1. Lambda表達式的操作符: ->
2. 操作符左側(cè):表達式參數(shù)列表;
操作符右邊:需要執(zhí)行的功能;
3. 參數(shù)列表,沒有參數(shù)的時候,小括號不能省略,有一個參數(shù)的時候,可以省略,如果有多個,小括號不能省略;
4. 參數(shù)列表中參數(shù)類型可以省略,Java會自動判斷;
5. 操作符右側(cè),方法體有多條需要用大括號{}包圍;
6. 操作符右側(cè),只有一條語句的時候,return和大括號都可以省略;
代碼??
package com.learn.noel.jdk8feature;
import org.junit.Test;
/**
* @Description
* @Author noel
* @Date 2021/12/28
* Version 1.0
**/
public class Jdk8FeatureApplication {
//將給定字符串轉(zhuǎn)為大寫字符串
@Test
public void converter(){
//調(diào)用Ⅱ的字符串處理方法,lambda表達式才是接口方法的具體實現(xiàn)
String result = strHandler("ssass",(str)->str.toUpperCase());//Ⅰ
System.out.println(result);
}
//Ⅱ
//定義字符串處理方法,具體實現(xiàn)由調(diào)用的時候決定
public String strHandler(String str, dealString handler){
return handler.getValue(str);//調(diào)用Ⅲ中接口的方法,并未實現(xiàn)該方法
}
}
package com.learn.noel.jdk8feature;
/**
* @Description
* @Author noel
* @Date 2021/12/28
* Version 1.0
**/
//Ⅲ
@FunctionalInterface
public interface dealString {
public String getValue(String s);
}
如果不這樣寫,可能會:
1、創(chuàng)建一個類,實現(xiàn)上面的dealString接口;
2、然后實例化上一步創(chuàng)建的類,實現(xiàn)該方法,這個案例是實現(xiàn)小寫全部轉(zhuǎn)換為大寫的功能;
3、通過實例化方法使用小寫轉(zhuǎn)大寫功能;
4、如果有其他字符串處理功能需要實現(xiàn),有多少個功能就需要實現(xiàn)多少個對應(yīng)的類和方法,造成代碼冗余;
上面執(zhí)行完成后,等同于:
String getValue(String s){
return s.toUpperCase();
}
再舉個??,使用JAVA自帶的幾何類實現(xiàn)內(nèi)容比較:
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public List<Employee> employees = Arrays.asList(
new Employee(101,18,"張三", 9999.99),
new Employee(102,59,"理司", 3333.4),
new Employee(103,18,"王五", 7777.7),
new Employee(104,8,"趙六", 6665.3),
new Employee(105,38,"天切", 5555)
);
@Test
public void compare(){
//如果員工年齡相等則使用姓名按字典順序排序,最后輸出排序結(jié)果
Collections.sort(employees,(e1, e2)->{
int result = (e1.getAge()==e2.getAge())? e1.getName().compareTo(e2.getName()):Integer.compare(e1.getAge(),e2.getAge());
return result;
});
for(Employee employee:employees){
System.out.println(employee);
}
}
Collections類有一個排序方法,其方法簽名如下:
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
sort方法的第二個參數(shù),是一個接口Comparator,該接口有個compare方法:
int compare(T o1, T o2);
sort方法的實現(xiàn):
default void sort(Comparator<? super E> c) {
Object[] a = this.toArray();
Arrays.sort(a, (Comparator) c);
ListIterator<E> i = this.listIterator();
for (Object e : a) {
i.next();
i.set((E) e);
}
}
Employee代碼:
package com.learn.noel.jdk8feature;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Description
* @Author noel
* @Date 2021/12/28
* Version 1.0
**/
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Employee {
int number;
int age;
String name;
double salary;
}