Java 8新特性:lambda表達式(四)轉載總結

Java 8終於引進了lambda表達式,這標誌着Java往函數式編程又邁進了一小步。

在Java 8以前的代碼中,爲了實現帶一個方法的接口,往往需要定義一個匿名類並複寫接口方法,代碼顯得很臃腫。比如常見的Comparator接口:

String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(oldWay, new Comparator<String>() {
    @Override
    public int compare(String s1, String s2) {
        // 忽略大小寫排序:
        return s1.toLowerCase().compareTo(s2.toLowerCase());
    }
});
System.out.println(String.join(", ", oldWay));

對於只有一個方法的接口,在Java 8中,現在可以把它視爲一個函數,用lambda表示式簡化如下:

String[] newWay = "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(newWay, (s1, s2) -> {
    return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(String.join(", ", newWay));

Java 8沒有引入新的關鍵字lambda,而是用()->{}這個奇怪的符號表示lambda函數。函數類型不需要申明,可以由接口的方法簽名自動推導出來,對於上面的lambda函數:

(s1, s2) -> {
    return s1.toLowerCase().compareTo(s2.toLowerCase());
});

參數由Comparator<String>自動推導出String類型,返回值也必須符合接口的方法簽名。

實際上,lambda表達式最終也被編譯爲一個實現類,不過語法上做了簡化。

對於Java自帶的標準庫裏的大量單一方法接口,很多都已經標記爲@FunctionalInterface,表明該接口可以作爲函數使用。

Runnable接口爲例,很多時候幹活的代碼還沒有定義class的代碼多,現在可以用lambda實現:

public static void main(String[] args) {
    // old way:
    Runnable oldRunnable = new Runnable() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + ": Old Runnable");
        }
    };
    Runnable newRunnable = () -> {
        System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable");
    };
    new Thread(oldRunnable).start();
    new Thread(newRunnable).start();
}

在未來的Java代碼中,會出現越來越多的()->{}表達式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章