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

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

使用 watermark 成員變量 arr mar .net [] size mark


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表達式介紹完成。!!!

~~~~~

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