大約有一年的時間了-但是隨著Java是現在開源的,我們可以看看并立即嘗試使用它。 所以走吧!
下載并安裝啟用Lambda的Java 8
首先,我希望我必須自己編譯Java 8,因為它尚未發布。 但是令我感到驚訝的是,在http://jdk8.java.net/lambda/上有適用于所有平臺的二進制版本。 因此,我只是下載了最新的開發人員預覽版本并將其安裝在我的計算機上。

為確保其正常工作,我創建了一個包含“ Hello,World!”的LambdaIntro類,并對其進行了編譯和執行:
~ $ export JAVA_HOME=~/Devtools/Java/jdk1.8.0/
~ $ cd spikes/lambda-water
~ $ $JAVA_HOME/bin/javac src/net/jthoenes/blog/spike/lambda/LambdaIntro.java
~ $ $JAVA_HOME/bin/java -cp src net.jthoenes.blog.spike.lambda.LambdaIntro
Hello from Java 8!
注意 :我使用命令行在此處進行編譯和執行,因為IDE到目前為止不支持Java 8。
非lambda方式
作為示例,假設我要遍歷對象列表。 但是對于我的業務邏輯,我需要具有列表項的值和索引。 如果要使用當前的Java,則必須處理索引以及實際的邏輯:
List list = Arrays.asList('A', 'B', 'C');
for (int index = 0; index < list.size(); index++) { String value = list.get(index); String output = String.format('%d -> %s', index, value);System.out.println(output);
}
這將輸出
0 -> A
1 -> B
2 -> C
這還不錯,但是我在幾行代碼中做了兩件事:控制迭代并提供一些(非常簡單的)業務邏輯。 Lambda表達式可以幫助我將兩者分開。\
eachWithIndex方法簽名
所以我想有一個方法eachWithIndex ,可以這樣調用:
List list = Arrays.asList('A', 'B', 'C');
eachWithIndex(list,(value, index) -> {String output = String.format('%d -> %s', index, value);System.out.println(output);}
);
該方法接收兩個參數。 第一個是列表,第二個是lambda表達式或閉包,它指示方法如何處理每個列表項。 正如您在第3行中看到的那樣,lambda表達式收到兩個參數:當前值和當前索引。 這些參數沒有類型聲明。 類型信息將由Java 8編譯器推斷。 在參數之后,有一個->和一個代碼塊,應為每個列表項執行。
注意 :您將必須在普通的文本編輯器中編寫此方法,或者忽略IDE中的錯誤消息。
實現eachWithIndex方法
要在Java 8中使用lambda,您需要聲明一個功能接口。 功能接口是僅具有一種方法的接口,該方法將由lambda表達式實現。 在這種情況下,我需要聲明一個方法,該方法接收項目和索引,但不返回任何內容。 因此,我定義了以下接口:
public static interface ItemWithIndexVisitor<E> {public void visit(E item, int index);
}
現在,通過此接口,我可以實現eachWithIndex方法。
public static <E> void eachWithIndex(List<E> list, ItemWithIndexVisitor<E> visitor) {for (int i = 0; i < list.size(); i++) {visitor.visit(list.get(i), i);}
}
該方法利用通用參數<E> ,因此將推斷傳遞給visit方法的項目與列表具有相同的類型。
使用功能接口的好處是,Java中已經有很多接口了。 考慮一下java.util.concurrent.Callable接口的示例。 它可以用作lambda,而不必更改使用Callable的代碼。 這使得默認情況下啟用了許多JDK和框架lambda。
使用方法參考
來自Lambda項目的一件方便的事情是方法引用。 它們是重用現有方法并將其打包到功能接口對象中的一種方法。 所以說我有以下方法
public static <E> void printItem(E value, int index) {String output = String.format('%d -> %s', index, value);System.out.println(output);
}
而且我想在我的eachWithIndex方法中使用此方法,而不是可以在方法調用中使用::符號:
eachWithIndex(list, LambdaIntro::printItem);
看起來很簡潔,不是嗎?
摘要
這使我的第一個lambda示例得以運行。 在渴望了很長時間之后,我無法回避地笑著看到關閉在我的一個Java程序中運行。 Lambda Expression當前僅可用于開發人員預覽版本。 如果您想了解更多信息,請閱讀當前的Early Draft Review或轉到Project Lambda項目頁面。
我將完整的示例代碼上傳到gist 。
參考: Java 8:在Johannes Thoenes博客博客上從JCG合作伙伴 Johannes Thoenes 測試Lambda Water 。
翻譯自: https://www.javacodegeeks.com/2012/08/java-8-testing-lambda-water.html