lambda運算式在jdk1.8引入,屬于函式式編程,可以在特定的場景中省去很多沒有意義的代碼,只留下核心邏輯,使代碼看起來更簡潔,
函式式介面
任何介面,如果只包含唯一一個抽象方法,那么它就是一個函式式介面,對于函式式介面,可以通過lambda運算式來創建該介面的物件,
lambda運算式的推導
1. 正常實作
//1. 首先定義一個函式式介面
interface LambdaInterface{ void lambda(); }
//2. 實作類
class LambdaImpl implements LambdaInterface{
public void lambda(){
System.out.println("lambda test");
}
}
//3. 一般實作
public class TestLambda{
//main函式
public static void main(String[] args){
//創建一個新物件,
LambdaImpl lambda = new LambdaImpl();
lambda.lambda();
}
}
2. 靜態內部類實作
將單獨的實作類添加到Test類中,作為靜態內部類,少定義了一個外部類
//1. 定義一個函式式介面
interface LambdaInterface { void lambda(); }
//2. 使用靜態內部類實作
public class TestLambda {
//實作類作為靜態內部類
static class LambdaImpl implements LambdaInterface {
public void lambda() {
System.out.println("lambda test!!");
}
}
public static void main(String[] args) {
new LmabdaImpl().lambda();
}
}
3. 通過區域內部類實作
將靜態內部類進一步簡化為區域內部類
//1. 定義一個函式式介面
interface LambdaInterface { void lambda(); }
//2. 使用區域內部類實作
public class TestLambda{
public static void main(String[] args) {
//2.實作類作為區域內部類
class LambdaImpl implements LambdaInterface{
public void lambda(){ System.out.println("lambda test!!");}
}
}
new LambdaImpl().lambda();
}
4. 通過匿名內部類實作
實作類是不需要類名的,只要實作方法即可,這里將其作為匿名內部類,進行類名的簡化
//1. 定義一個函式式介面
interface LambdaInterface { void lambda(); }
//2. 使用匿名內部類實作
public class TestLambda{
public static void main(String[] args){
//直接在匿名內部類中實作LambdaInterface介面
LambdaTest lambda = new LambdaInterface(){
public void lambda(){
System.out.println("lambda test!!");}
}
lambda.lambda();//父類參考指向子類實體,多型
}
}
5. lambda簡化
由于介面式函式中只有一個方法,即使通過匿名內部類實作,也必須指定方法名,這是沒有意義的,因此在lambda運算式中,將默認的類名和方法名省略掉
//1. 定義一個函式式介面
interface LambdaInterface { void lambda(); }
//2. 使用lambda運算式實作
public class TestLambda{
public static void main(String[] args){
//將指定類名和方法名的程序全部省略,直接使用()->{}代替
LambdaTest lambda = ()->{ System.out.println("lambda test!!");}
lambda.lambda();//父類參考指向子類實體,多型
}
}
6. 帶有引數的lambda運算式
lambda運算式是可以帶有引數的:
//1. 定義一個帶有引數的函式式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda運算式實作
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (Character c) -> {
System.out.println(c + " was pressed");
};
}
}
6.1 簡化引數型別
由于函式式介面只有一個方法,不存在多載的情況,因此引數串列式固定的,可以省略引數的型別:
//1. 定義一個帶有引數的函式式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda運算式實作
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = (c) -> { //省略了引數的型別
System.out.println(c + " was pressed");
};
keyBoard.type('a');
}
}
6.2 省略小括號
當lambda運算式只有一個引數的時候,連包裹引數串列的小括號也是可以省略的:
//1. 定義一個帶有引數的函式式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda運算式實作
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> {
System.out.println(c + " was pressed");
};
keyBoard.type('a');
}
}
6.3 省略花括號
當lambda運算式實作的方法只有一條陳述句的時候,甚至還可以省略包裹方法體的花括號:
//1. 定義一個帶有引數的函式式介面
interface KeyBoard{void type(Character c);}
//2. 使用lambda運算式實作
public class Test2{
public static void main(String[] args){
KeyBoard keyBoard = c -> System.out.println(c + " was pressed");
keyBoard.type('a');
}
}
希望可以幫到你,還有未來的我
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/549266.html
標籤:Java
上一篇:day04-SpringCloud Eureka-服務注冊與發現01
下一篇:萬字詳解 | Java 流式編程
