1. 程式人生 > >JDK8新特性----Lambda表示式

JDK8新特性----Lambda表示式

背景:

最近跳槽了,跳到一個支付行業裡面,相比以前做稅務用的JDK6,新公司採用的是JDK8,本文簡單認識JDK8的重要新特性之一——Lambda表示式。在JDK8之前,Java是不支援函數語言程式設計的,所謂的函式程式設計,即可理解是將一個函式(也稱為“行為”)作為一個引數進行傳遞。通常我們提及得更多的是面向物件程式設計,面向物件程式設計是對資料的抽象(各種各樣的POJO類),而函數語言程式設計則是對行為的抽象(將行為作為一個引數進行傳遞)。在JavaScript中這是很常見的一個語法特性,但在Java中將一個函式作為引數傳遞這卻行不通,好在JDK8的出現打破了Java的這一限制。

Lambda表示式的優勢:

1. 簡潔。

2. 非常容易平行計算。---函數語言程式設計的一大優勢,具體可參考《函數語言程式設計與面向物件程式設計的優劣》

3. 可能代表未來的程式設計趨勢。

認識Lambda表示式:

Lambda表示式一共有三部分組成:

表示式大致可以分為一共有五種基本形式,具體如下:

  1. 無引數執行 = () -> System.out.println("Hello World");
  2. 一個引數 = event -> System.out.println("button clicked");
  3. Runnable multiStatement = () -> {System.out.print("Hello");System.out.println(" World");};
  4. 多引數執行 = (x, y) -> x + y;
  5. 引數帶型別的 = (Long x, Long y) -> x + y;

➊中所示的 Lambda 表示式不包含引數,使用空括號 () 表示沒有引數。該 Lambda 表示式 實現了 Runnable 介面,該介面也只有一個 run 方法,沒有引數,且返回型別為 void。➋中所示的 Lambda 表示式包含且只包含一個引數,可省略引數的括號,這和例 2-2 中的 形式一樣。Lambda 表示式的主體不僅可以是一個表示式,而且也可以是一段程式碼塊,使用大括號 ({})將程式碼塊括起來,如➌所示。該程式碼塊和普通方法遵循的規則別無二致,可以用返 回或丟擲異常來退出。只有一行程式碼的 Lambda 表示式也可使用大括號,用以明確 Lambda表示式從何處開始、到哪裡結束。Lambda 表示式也可以表示包含多個引數的方法,如➍所示。這時就有必要思考怎樣去閱 讀該 Lambda 表示式。這行程式碼並不是將兩個數字相加,而是建立了一個函式,用來計算 兩個數字相加的結果。變數 add 的型別是 BinaryOperator

記住一點很重要,Lambda 表示式都可以擴寫為原始的“匿名類”形式。所以當你覺得這個 Lambda 表示式很複雜不容易理解的時候,不妨把它擴寫為“匿名類”形式來看。

使用場景舉例:

場景1:用Lambda表示式實現Runnable介面

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Hello World!");
    }
});

使用Lambda表示式則只需要使用一句話就可代替上面使用匿名類的方式。

new Thread(() -> System.out.println("Hello World!"));

場景2:用Lambda表示式進行List迭代 

//Prior Java 8 :
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
    System.out.println(feature);
}
//In Java 8:
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));

場景3:使用Lambda表示式和函式式介面Predicate

除了提供函數語言程式設計語言級別的支援外,java8同時也新增了一個新的包java.util.function。其中包含了許多類來支援java函數語言程式設計。其中之一是Predicate介面,使用這個介面和lamb表示式就可以以更少的程式碼為API方法新增更多的動態行為。

public static void main(args[]){
    List languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp");
    System.out.println("Languages which starts with J :");
    filter(languages, (str)->str.startsWith("J"));
    System.out.println("Languages which ends with a ");
    filter(languages, (str)->str.endsWith("a"));
    System.out.println("Print all languages :");
    filter(languages, (str)->true);
    System.out.println("Print no language : ");
    filter(languages, (str)->false);
    System.out.println("Print language whose length greater than 4:");
    filter(languages, (str)->str.length() > 4);
}
public static void filter(List names, Predicate condition) {
    for(String name: names) {
        if(condition.test(name)) {
            System.out.println(name + " ");
        }
    }
}

此外還有一些例如Map和Reduce的例子 ,打算重開一章來說