lambda expression

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();
相關文章
相關標籤/搜索