Java 8 | Lambda 表達式
Lambda
表達式(也稱為閉包)是Java 8
中最大和最令人期待的語言改變。它允許我們將函數當成參數傳遞給某個方法,或者把程式碼本身當作資料處理:函數式開發者非常熟悉這些概念。很多JVM平台上的語言(Groovy
、Scala
等)從誕生之日就支持Lambda
表達式,但是Java開發者沒有選擇,只能使用匿名內部類代替Lambda
表達式。
Lambda
的設計耗費了很多時間和很大的社區力量,最終找到一種折中的實現方案,可以實現簡潔而緊湊的語言結構。最簡單的Lambda
表達式可由逗號分隔的參數列表、->
符號和語句塊組成,例如:
1 | Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) ); |
在上面這個程式碼中的參數e的類型是由編譯器推理得出的,你也可以顯式指定該參數的類型,例如:
1 | Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) ); |
如果Lambda
表達式需要更複雜的語句塊,則可以使用花括號將該語句塊括起來,類似於Java
中的函數體,例如:
1 | Arrays.asList( "a", "b", "d" ).forEach( e -> { |
Lambda
表達式可以引用類成員和局部變量(會將這些變量隱式得轉換成final
的),例如下列兩個程式碼塊的效果完全相同:
1 | String separator = ","; |
和
1 | final String separator = ","; |
Lambda
表達式有返回值,返回值的類型也由編譯器推理得出。如果Lambda
表達式中的語句塊只有一行,則可以不用使用return
語句,下列兩個程式碼片段效果相同:
1 | Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) ); |
和
1 | Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> { |
註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南