Like Share Discussion Bookmark Smile

J.J. Huang   2020-04-01   Java   瀏覽次數:

Java 8 | Lambda 表達式

Lambda表達式(也稱為閉包)是Java 8中最大和最令人期待的語言改變。它允許我們將函數當成參數傳遞給某個方法,或者把程式碼本身當作數據處理:函數式開發者非常熟悉這些概念。很多JVM平台上的語言(GroovyScala等)從誕生之日就支持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
2
3
4
Arrays.asList( "a", "b", "d" ).forEach( e -> {
System.out.print( e );
System.out.print( e );
} );

Lambda表達式可以引用類成員和局部變量(會將這些變量隱式得轉換成final的),例如下列兩個程式碼塊的效果完全相同:

1
2
3
String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );

1
2
3
final String separator = ",";
Arrays.asList( "a", "b", "d" ).forEach(
( String e ) -> System.out.print( e + separator ) );

Lambda表達式有返回值,返回值的類型也由編譯器推理得出。如果Lambda表達式中的語句塊只有一行,則可以不用使用return語句,下列兩個程式碼片段效果相同:

1
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );

1
2
3
4
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
int result = e1.compareTo( e2 );
return result;
} );

註:以上參考了
Java 8 Lambda新語法,簡化程式,增強效能
Java 8 新特性
Java 8的新特性—终极版
现代化 Java - Java8 指南