透過這些示例快速學習Java lambda語法

banq發表於2018-12-14

對於那些不熟悉函數語言程式設計的人來說,基本的Java lambda語法起初可能有點令人生畏。但是,一旦將lambda表示式分解為它們的組成部分,語法很快就會變得有意義並變得非常自然。

Java中lambda表示式的目標是實現單個方法。所有Java方法都有一個引數列表和一個正文,因此毫不奇怪這兩個元素是Java lambda語法的重要組成部分。此外,Java lambda語法用箭頭分隔這兩個元素。因此,要學習Java lambda語法,您需要熟悉它的三個組成部分:
  1. 引數列表
  2. 箭頭
  3. 方法體

要應用這些概念,我們首先需要一個功能介面。功能介面是僅定義必須實現的單個方法的介面。以下是我們將用於此示例的功能介面:

interface SingleArgument {
   public void foo(String s);
}

此介面的方法需要傳入String引數,lambda為SingleArgument介面提供了一個實現,以及對介面的foo方法的幾次呼叫:

SingleArgument sa1 =  n -> System.out.print(n);
sa1.foo("Let us all");
sa1.foo(" learn lambda syntax");


以下是實現此邏輯的完整類:

public class LearnJavaLambdaSyntax {
    
   public static void main(String args[]) {    
      SingleArgument sa1 =  n -> System.out.print(n);
      sa1.foo("Let us all");
      sa1.foo(" learn lambda syntax");
   }
}

interface SingleArgument {
   public void foo(String s);
}


簡明扼要的Java lambda語法
上面演示的實現是高度縮寫的。這有時會讓新手學習Java lambda語法有點困難。有時候,為程式碼新增更多的儀式是有幫助的。可以使學習Java lambda語法更容易的一個增強是在方法簽名周圍放置圓括號並在左側包含型別宣告:
SingleArgument sa2 = (String n) - > System.out.print(n) ;

此外,您可以在右側的內容周圍放置花括號,並使用分號結束每個語句

SingleArgument sa3 = (String n) - > {System.out.print(n); } ;


多行lambda表示式語法
實際上,如果您的方法實現具有多個語句,則需要使用分號和大括號。例如,如果我們想要使用正規表示式,在列印出一段給定的文字之前去除所有空格,我們的Java lambda語法將如下所示:

(String n) -> {
    n = n.replaceAll("\\s","");
    System.out.print(n);
}



多引數lambda函式
在此示例中,函式介面中的方法只有一個引數,但多個引數完全有效,只要lambda表示式中的引數數量與功能介面的方法中的數字匹配即可。由於Java是強型別語言,因此物件型別也必須是多型匹配。
以下面的功能介面為例:

interface MultipleArguments { 
   public void bar(String s,int i); 
}

用於實現此功能介面的高度禮儀式Java lambda語法如下:

MultipleArguments ma1 = (String p, int x) -> {
   System.out.printf("%s wants %s slices of pie.\n", p, x);
};


如您所見,這個lambda表示式利用了多個引數,而不僅僅是一個。
我把這個例子描述為高度儀式,因為我們可以大大降低其冗長度。我們可以刪除左邊的型別宣告,我們可以刪除右邊的花括號和冒號,因為方法實現中只有一條指令。Java lambda語法的更簡潔用法如下:

( p, x ) -> System.out.printf ( "%s wants %s slices.\n", p, x )


正如您所看到的,Java lambda語法與傳統JDK開發人員習慣的語法略有不同,但與此同時,當您將其分解時,很容易看出所有部分是如何組合在一起的。透過一些練習,開發人員很快就學會了喜歡Java lambda語法。

以在GitHub找到本教程中使用的原始碼。

相關文章