1. 程式人生 > >Java 8的Lambda表示式學習

Java 8的Lambda表示式學習

Lambda表示式(也稱為閉包)是整個Java 8發行版中最受期待的在Java語言層面上的改變。

Lambda允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),或者把程式碼看成資料:函式式程式設計師對這一概念非常熟悉。在JVM平臺上的很多語言(Groovy,Scala,……)從一開始就有Lambda,但是Java程式設計師不得不使用毫無新意的匿名類來代替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的話,它們會被隱含的轉為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;

} );