1. 程式人生 > >java8新增特性(一)---Lambda表示式

java8新增特性(一)---Lambda表示式

         Lambda表示式也成為閉包,是java語言層次上的改變,Lambda允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),或者把程式碼看成資料,函式式程式設計師對這一概念非常熟悉。在JVM平臺上有很多語言(groovy,scala等等)從一開始就有Lambda,但是程式設計師不得不使用匿名類來代替lambda。

看一下jdk7之前實現字串排序:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class Old {

    public static void main(String[] args) {
        List<String> nameList = Arrays.asList("panther","peter","lucy","jake");
        Collections.sort(nameList, new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o1.compareTo(o2);
            }
        });
        System.out.println(nameList);

    }
}
執行結果:


只需要給靜態方法傳入一個List物件以及一個比較器來按制定順序排列,通常的方法是建立一個匿名的比較器物件然後將其傳遞給sort方法。

看一下java8怎麼用lambda實現上述功能:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class New {

    public static void main(String[] args) {
        List<String> nameList = Arrays.asList("panther", "peter", "lucy", "jake");
        //第一種寫法
        Collections.sort(nameList, (String a, String b) -> {
            return b.compareTo(a);
        });
        //第二種寫法
        Collections.sort(nameList, (a, b) -> {
            return b.compareTo(a);
        });
        //第三種寫法
        Collections.sort(nameList, (a, b) -> b.compareTo(a));

        nameList.forEach(e -> System.out.println(e));
    }
}

執行結果:


java編譯器可以自動推匯出引數型別,所以你可以不用再寫一次型別!!!!

       看下面lambda的例子:

程式碼:

package com.panther.dong.java8.lambda;

import java.util.Arrays;
import java.util.List;

/**
 * Created by panther on 15-8-22.
 */
public class LambdaTest {
    public static String separator = ",";

    public static void main(String[] args) {
        //Lambda可以把函式體放到一對花括號中,就像在java中定義普通函式那樣
        System.out.println("-----Lambda Test1-----");
        Arrays.asList("a", "b", "c", "d").forEach(e -> {
            System.out.println(e);
        });

        //Lambda可以引用類的成員變數和區域性變數(如果變數不是final的話,它會被隱含的轉為final,這樣效率更高)
        System.out.println("--------Lambda Test2--------");
        Arrays.asList("a", "b", "c", "d").forEach((String e) -> System.out.println(e + LambdaTest.separator));

        System.out.println("--------Lambda Test3---------");
        List<String> resultList = Arrays.asList("a", "c", "b", "d");
        resultList.sort((e1, e2) -> {
            int result = e1.compareTo(e2);
            return result;
        });

        resultList.forEach(e -> {
            System.out.println(e);
        });
    }
}

執行結果:

Lambda表示式介紹完畢!!!!~~~~~