作為語法糖啤握,其實現(xiàn)邏輯分為三步:
第一步:有一個函數(shù)式接口(創(chuàng)建一個接口非洲,包含一個未實現(xiàn)的方法);
第二步:有一個方法A,將接口作為A的形參俯画;
第三步:顯示調(diào)用方法A析桥,Lambda表達(dá)式作為實參代替第二步的形參,既完成了接口調(diào)用。
LAMBDA表達(dá)式需要函數(shù)式接口支持
格式:
1. Lambda表達(dá)式的操作符: ->
2. 操作符左側(cè):表達(dá)式參數(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表達(dá)式才是接口方法的具體實現(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;
}