Lambda表達式是java Stream的使用基礎。java
lambda表達式的語法由參數列表、->和函數體組成。函數體既能夠是一個表達式,也能夠是一個語句塊。表達式執行後會返回執行結果。語句塊中使用return將控制權轉給調用者。表達式函數體省略return,適用於小型表達式,使得語法更加簡潔。函數
參數能夠無參或多個參數,參數能夠指定數據類型,參數放在()中,無參的狀況下()中爲空,單參能夠不用();函數體能夠爲表達式或語句塊,單個表達式也能夠放在語句塊中。優化
接口:spa
1 public interface OnClickListener { 2 void doOnClick(); 3 }
無參Lambda表達式:code
1 OnClickListener mListener = () -> System.out.println("do on Click"); 2 或 3 OnClickListener mListener_ = () -> { 4 System.out.println("插上電源"); 5 System.out.println("打開電視"); 6 };
單個參數的狀況下,能夠省略(),多參數的狀況不能夠省略。對象
1 OnItemClickListener mItemListener = position -> System.out.println("position = [" + position + "]"); 2 IMathListener mPlusListener = (x, y) -> x + y;
能夠指定參數的類型,這時傳入的參數類型必須匹配,不然編譯錯誤。blog
1 IMathListener mSubListener = (int x, int y) -> x - y;
Lambda表達式中,修改方法體中引入的外部變量會報錯,即Lambda表達式引用的是值而不是變量。接口
函數式接口是Java8中提供的一種特殊類型的接口,該接口中只定義了惟一的抽象方法,用做表達式的類型。下面是一個函數式接口的例子。字符串
1 public interface IMathListener { 2 int doMathOperator(int start, int plusValue); 3 }
下面用Lambda表達式聲明瞭函數式接口IMathListener的實現。get
1 IMathListener mSubListener = (x, y) -> x - y; 2 mMaxListener.doMathOperator(10, 5));// 其值:5
對於函數接口而言,接口中惟一方法的命名並不重要了,只要方法簽名和Lambda表達式的類別相匹配便可。但爲了增長可讀性,須要參數名稱有意義。
現有的靜態方法也能夠支持Lambda表達式。
1 public class Math { 2 public static int doIntPlus(int start, int plusValue) { 3 return start + plusValue; 4 } 5 }
關聯:函數簽名同樣就能夠,經過函數調用,直接生成了一個IMathListener對象。
1 IMathListener mPlusListener = Math::doIntPlus;
Lambda表達式都是靜態類型的,在編譯器編譯,因此被引用的方法必須是靜態方法。
每一個用做函數接口的接口都應添加 @FunctionalInterface註釋,該註釋會強制 javac 檢查一個接口是否符合函數接口的標準。若是該接口添加給枚舉類型、類或函數不止一個的接口,javac會報錯。
能夠人工指定返回值數據類型。
1 overloadedMethod((x)->(String)y);
數據類型推導:Lambda表達式做爲參數時,其類型由它的目標類型推導得出,規則以下。
總結:
使用Lambda表達式避免使用大量的匿名內部類,提升代碼可讀性。
Lambda表達式是匿名方法,旨在經過用輕量級機制替換匿名內部類的機制來解決「垂直問題」。
如下是lambda表達式的一些示例:
1 (int x, int y) -> x + y 2 3 () -> 42 4 5 (String s) -> { System.out.println(s); }
第一個表達式採用兩個整數參數,名爲and ,並返回它們的和。第二個不帶參數並返回整數。第三個接受一個字符串並將其打印到控制檯,什麼都不返回。xy42
通常語法包括參數列表,箭頭標記->
和正文。正文能夠是單個表達式,也能夠是語句塊。在表達式中,簡單地評估並返回正文。在塊形式中,body被評估爲方法體 - return
語句將控制權返回給匿名方法的調用者; break
而且continue
在頂級是非法的,但固然容許在循環中; 若是正文產生結果,則每一個控制路徑必須返回一些內容或拋出異常。
語法針對lambda表達式很是小的常見狀況進行了優化,如上所示。例如,表達式 - 體形式消除了對return
關鍵字的須要,不然關鍵字可能表明相對於表達式大小的實質語法開銷。
還指望lambda表達式常常出如今嵌套上下文中,例如方法調用的參數或另外一個 lambda表達式的結果。爲了在這些狀況下最小化噪聲,避免了沒必要要的分隔符。可是,對於將整個表達式設置爲有用的狀況,能夠用括號括起來,就像任何其餘表達式同樣。
如下是語句中出現的lambda表達式的一些示例:
1 FileFilter java = (File f) -> f.getName().endsWith(".java"); 2 3 String user = doPrivileged(() -> System.getProperty("user.name")); 4 5 new Thread(() -> { 6 connectToService(); 7 sendNotification(); 8 }).start();