Redis 知識突擊專用
Lamda表示式
函數語言程式設計思想
強調的是做什麼,而不是以什麼樣的方式來做,它忽略了面向物件的複雜語法,只要能夠獲取到結果,怎麼做的都不重要,重要的是結果,不重視過程.
冗餘的程式碼寫法:
public class Demo01{ public static void main(String[] args){ //匿名內部類的方式 new Thread(new Runnable(){ @Override public void run(){ System.out.println("開啟啦一個新的執行緒任務"); } }).start(;) } }
程式碼分析
對於Runnable的匿名內部類用法,可以分析以下內容:
- Thread類需要Runnable介面作為引數,其中抽象方法run用來指定執行緒任務內容的核心
- 為了指定run方法體,不得不需要實現Runnable介面的抽象類
- 為了省去定義一個Runnable實現類的麻煩,不得不使用匿名內部類
- 必須重寫抽象方法run方法.所以方法的名稱,方法的引數,方法的返回值不得不再寫一遍,且不能寫錯.
- 在這時刻,只有方法體才是執行緒任務的關鍵性內容,所以引入Landa表示式簡化程式碼
程式設計思想的轉換
做什麼.而不是怎麼做
我們真正希望的是:就是將run方法體內的程式碼傳遞給Thread類,啟動執行緒可以執行這些程式碼即可.
傳遞程式碼
2014年3月Oracle官方所釋出的java8(JDK1.8)中,加入了Lamda表示式
體驗Lamda表示式的更優寫法
Java 8的新特性.優化剛才的程式碼
public class Demo01{ public static void main(String[] args){ //匿名內部類的方式 new Thread(()->{ System.out.println("開啟啦一個新的執行緒任務"); } }).start(); } }
從上面的程式碼可以看出:沒有建立介面實現類物件的操作,也不再有抽象方法覆蓋重寫的操作,只寫啦執行緒任務的內容.
案例:
定義一個廚子介面,有一個抽象方法做飯的方法,無參無返回值 ,然後用Lamda表示式的方式實現輸出一條語句
//定義一個廚子介面
public interface Cook {
public abstract void cooking();
}
//用lamda表示式實現
public static void main(String[] args) {
//這是匿名類的寫法
Cook cook= new Cook() {
@Override
public void cooking() {
System.out.println("我今天吃的是紅燒茄子,吃的好開心");
}
};
//Lamda表示式的寫法
Cook cook = ()->{
System.out.println("我今天吃的是紅燒茄子,吃的好開心");
};
cook.cooking();
}
}
練習3:給定一個計算器介面, 內建了一個抽象方法計算的方法, 可以將兩個double型別的數字 相加得到和值。使用.ambda表示式來實現以上需求。(有參 有返回)
程式碼示例:
Lambda省略格式
可推導即可省略
Lambda強調的是做什麼”,而不是“怎麼做",所以凡是可以根據上下文推導得知的資訊,都可以省略。比如:
invokeSum(3.14, 3.15, (double d1,double d2) -> {
return d1 + d2;
});
//省略格式表達
invokeSum(3.14,3.15,(d1,d2) ->d1+d2);
省略的規則:
在Lambda標準格式的表示式的基礎上,使用省略寫法的規則是:
1.小括號內參數的型別可以省略。
2.如果小括號內有且僅有個引數, 則小括號也可以省略
3.如果大括號內有且僅有個語句,則無論是否有返回值, 都可以省略大括號、return關鍵字和語句的分號。
Lambda的使用前提
Lambda的語法非常的簡潔,使用非常的簡單,但是有以下注意事項:
1.使用L ambda必須具有介面,且要求介面中有且僅有一個抽象方法
無論JDK內建的Runnable、Comparator介面還是自定義的介面,只有當介面中的抽象方法存在且唯, 才可以使用L ambda
2.使用L ambda必須具有上下文推斷。
也就是方法的引數或者區域性變數型別必須為ambda對應的接]型別,才能使用L ambda作為該接[的例項。
備註: 有且僅有一個抽象方法的介面,稱為函式式介面