lambda表達式:
- 一個lambda表達- 式是一個帶有參數(shù)的代碼塊
- 當你想要代碼塊在以后某個時間點執(zhí)行時,可以使用lambda表達式
- lambda表達式可以被轉(zhuǎn)換為函數(shù)式接口
- lambda表達式可以在閉包作用域中有效的訪問final變量
- 方法和構(gòu)造器可以引用方法或構(gòu)造器,單無需調(diào)用他們
- 你現(xiàn)在可以向接口添加默認(default)和靜態(tài)(static)方法來提供具體的實現(xiàn)
- 你必須解決接口中多個默認方法之間的沖突
一, 定義
lambda表達式是一段可以傳遞的代碼,可以用來替代 runnable , onClickListener等
名稱由來: 數(shù)學原理, 帶有參數(shù)變量的表達式都被成為lambda表達式
二,lambda的語法:
基本語法:
(方法參數(shù)) -> 表達式
(Stirng first,String second) -> Integer.compare(first.length(), second.length())
(String first,String second) -> {
if (first.length()< second.length()) return -1;
else if (first.length() > second.length()) return 1;
else return 0;
}
() -> { for(int i = 0; i<1000; i++) doWork(); }
簡寫:
1,如果lambda的表達式的參數(shù)類型是可以被推導的,那么可以省略參數(shù)類型
2,如果在1的基礎上,方法參數(shù)只有一個,那么可以省略括號
EventHandler<ActionEvent> listener = event ->
System.out.println("Thanks for click!");
3,永遠不需要為一個lambda表達式執(zhí)行返回類型,他總是會從上下文中被推導出來
三, 函數(shù)式接口:
對于只包含一個抽象方法的接口,你可以通過lambda表達式來創(chuàng)建該接口的對象
四,方法引用:
要傳遞的代碼操作,已經(jīng)有實現(xiàn)的方法了,你可以使用方法引用:
對象::實例方法
類::靜態(tài)方法
以下代碼:
button.setOnAction(System.out::println)
相當于:
button.setOnAction(event -> System.out.println(event))
類::實例方法 這種寫法,第一個參數(shù)會成為執(zhí)行方法的對象
String::compareToIgnoreCase
相當于
(x,y) -> x.compareToIgnoreCase(y)
應用:
Arrays.sort(Strings, String::compareToIgnoreCase)
可以捕獲方法引用中的this參數(shù)
this::equala
等同于
x -> this.equals(x)
也可以使用 super::實例方法
構(gòu)造器引用 類::new 表示
五, 變量作用域
自由變量 : 不是表達式中 參數(shù),且沒有在表達式代碼中定義的變量
含有自由變量的代碼塊被稱之為閉包
在lambda表達式中,不能更改捕獲的自由變量的值
在lambda表達式中使用this關(guān)鍵字時,會引用創(chuàng)建該lambda表達式的方法的this參數(shù),比如:
public class Application{
public void doWork() {
Runnable runner = ( ) -> {
System.out.println( this.toString() );
};
}
}
上面代碼中的this.toString()是執(zhí)行Application的toString方法
六,默認方法
基于java的繼承機制, 要對現(xiàn)有的接口進行拓展新方法是非常困難的,這意味著以前實現(xiàn)該接口的類都需要重新實現(xiàn)新增的方法.
為了解決這個問題,java8允許接口包含帶有具體實現(xiàn)的方法(默認方法)
默認方法有方法體,并且在返回值前用default關(guān)鍵字修飾
如果一個接口中定義了一個默認方法,而另一個(或多個)父類或接口也定義了一個同簽名的方法,那么:
- 選擇父類中的方法, 如果父類提供了具體的實現(xiàn)方法,那么接口中的對應方法會被忽略 ("類優(yōu)先"規(guī)則)
- 接口沖突, 如果都是來源于接口的默認方法,那么 該類必須復寫該方法
七, 接口中的靜態(tài)方法
java8中,你可以為接口添加靜態(tài)方法