古詩詞大全網 - 藝術簽名 - Java8新特性lambda表達式有什麽用

Java8新特性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代碼中,會出現越來越多的()->{}表達式。