Java 8:测试Lambda水
大約有一年的時(shí)間了-但是隨著Java是現(xiàn)在開源的,我們可以看看并立即嘗試使用它。 所以走吧!
下載并安裝啟用Lambda的Java 8
首先,我希望我必須自己編譯Java 8,因?yàn)樗形窗l(fā)布。 但是令我感到驚訝的是,在http://jdk8.java.net/lambda/上有適用于所有平臺(tái)的二進(jìn)制版本。 因此,我只是下載了最新的開發(fā)人員預(yù)覽版本并將其安裝在我的計(jì)算機(jī)上。
為確保其正常工作,我創(chuàng)建了一個(gè)包含“ Hello,World!”的LambdaIntro類,并對其進(jìn)行了編譯和執(zhí)行:
~ $ 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!注意 :我使用命令行在此處進(jìn)行編譯和執(zhí)行,因?yàn)镮DE到目前為止不支持Java 8。
非lambda方式
作為示例,假設(shè)我要遍歷對象列表。 但是對于我的業(yè)務(wù)邏輯,我需要具有列表項(xiàng)的值和索引。 如果要使用當(dāng)前的Java,則必須處理索引以及實(shí)際的邏輯:
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這還不錯(cuò),但是我在幾行代碼中做了兩件事:控制迭代并提供一些(非常簡單的)業(yè)務(wù)邏輯。 Lambda表達(dá)式可以幫助我將兩者分開。\
eachWithIndex方法簽名
所以我想有一個(gè)方法eachWithIndex ,可以這樣調(diào)用:
List list = Arrays.asList('A', 'B', 'C'); eachWithIndex(list,(value, index) -> {String output = String.format('%d -> %s', index, value);System.out.println(output);} );該方法接收兩個(gè)參數(shù)。 第一個(gè)是列表,第二個(gè)是lambda表達(dá)式或閉包,它指示方法如何處理每個(gè)列表項(xiàng)。 正如您在第3行中看到的那樣,lambda表達(dá)式收到兩個(gè)參數(shù):當(dāng)前值和當(dāng)前索引。 這些參數(shù)沒有類型聲明。 類型信息將由Java 8編譯器推斷。 在參數(shù)之后,有一個(gè)->和一個(gè)代碼塊,應(yīng)為每個(gè)列表項(xiàng)執(zhí)行。
注意 :您將必須在普通的文本編輯器中編寫此方法,或者忽略IDE中的錯(cuò)誤消息。
實(shí)現(xiàn)eachWithIndex方法
要在Java 8中使用lambda,您需要聲明一個(gè)功能接口。 功能接口是僅具有一種方法的接口,該方法將由lambda表達(dá)式實(shí)現(xiàn)。 在這種情況下,我需要聲明一個(gè)方法,該方法接收項(xiàng)目和索引,但不返回任何內(nèi)容。 因此,我定義了以下接口:
public static interface ItemWithIndexVisitor<E> {public void visit(E item, int index); }現(xiàn)在,通過此接口,我可以實(shí)現(xiàn)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);} }該方法利用通用參數(shù)<E> ,因此將推斷傳遞給visit方法的項(xiàng)目與列表具有相同的類型。
使用功能接口的好處是,Java中已經(jīng)有很多接口了。 考慮一下java.util.concurrent.Callable接口的示例。 它可以用作lambda,而不必更改使用Callable的代碼。 這使得默認(rèn)情況下啟用了許多JDK和框架lambda。
使用方法參考
來自Lambda項(xiàng)目的一件方便的事情是方法引用。 它們是重用現(xiàn)有方法并將其打包到功能接口對象中的一種方法。 所以說我有以下方法
public static <E> void printItem(E value, int index) {String output = String.format('%d -> %s', index, value);System.out.println(output); }而且我想在我的eachWithIndex方法中使用此方法,而不是可以在方法調(diào)用中使用::符號:
eachWithIndex(list, LambdaIntro::printItem);看起來很簡潔,不是嗎?
摘要
這使我的第一個(gè)lambda示例得以運(yùn)行。 在渴望了很長時(shí)間之后,我無法回避地笑著看到關(guān)閉在我的一個(gè)Java程序中運(yùn)行。 Lambda Expression當(dāng)前僅可用于開發(fā)人員預(yù)覽版本。 如果您想了解更多信息,請閱讀當(dāng)前的Early Draft Review或轉(zhuǎn)到Project Lambda項(xiàng)目頁面。
我將完整的示例代碼上傳到gist 。
參考: Java 8:在Johannes Thoenes博客博客上從JCG合作伙伴 Johannes Thoenes 測試Lambda Water 。
翻譯自: https://www.javacodegeeks.com/2012/08/java-8-testing-lambda-water.html
總結(jié)
以上是生活随笔為你收集整理的Java 8:测试Lambda水的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享电脑无线网密码(咋分享无线网密码)
- 下一篇: Java执行程序服务类型