Java 8:測試Lambda水

Java 8大約有一年的時間了,它具有我非常期待的語言功能: Lambda Expression 。 令人遺憾的是,另一個重要功能Java平臺模塊已延遲到Java9。但是,將lambda表達式(或閉包)添加到該語言中將使Java編程變得更好。

大約有一年的時間了-但是隨著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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372196.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372196.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372196.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java定義js函數_JS中可以先使用函數,然后再定義.

首先要說明的,下面這種方式是對的,雖然不知道為什么,很奇怪為什么可以先使用,再定義,希望有了解的人可以給個說法.hello(www.openj.cn);function hello(name){alert("hello " name)};本文首發于 http://blog.openj.cn下面的這種定義函數方式,對于寫一些比較復雜的代碼…

基于閥值的工作流引擎設計

最近在做工作流處理流程部分的工作&#xff0c;順便研究了一下工作流引擎的一些設計理念和原理。由于以前接觸過人工智能神經網絡的一些東西&#xff0c;發現工作流引擎和神經網絡還是頗有一些相似之處&#xff0c;都是滿足一定的條件下向下一個節點傳遞。在神經網絡的神經元中…

Git之安裝管理

1.Git安裝部署 Git是分布式的版本控制系統&#xff0c;我們只要有了一個原始Git版本倉庫&#xff0c;就可以讓其他主機克隆走這個原始版本倉庫&#xff0c;從而使得一個Git版本倉庫可以被同時分布到不同的主機之上&#xff0c;并且每臺主機的版本庫都是一樣的&#xff0c;沒有主…

Java執行程序服務類型

ExecutorService功能是Java 5附帶的。它擴展了Executor接口&#xff0c;并提供了線程池功能來執行異步簡短任務。 使用Java 6提供的ExecutorService接口有五種異步執行任務的方法。 ExecutorService execService Executors.newCachedThreadPool&#xff08;&#xff09;; 這…

MySQL的主動優化和被動優化_MySQL“被動”性能優化匯總!

年少不知優化苦&#xff0c;遇坑方知優化難。 ——村口王大爺本文內容導圖如下&#xff1a;我之前有很多文章都在講性能優化的問題&#xff0c;比如下面這些&#xff1a;當然&#xff0c;本篇也是關于性能優化的&#xff0c;那性能優化就應該一把梭子嗎&#xff1f;還是要符合一…

python2

一、管理庫的安裝 安裝pip 提示報錯&#xff1a;安裝pip提示No module named setuptools Windows環境下Python默認是沒有安裝setuptools這個模塊的&#xff0c;這也是一個第三方模塊。下載地址為http://pypi.python.org/pypi/setuptools。下載后直接運行ez_setup.py 參考地址&…

Java Mybatis

Mybatis轉載于:https://www.cnblogs.com/leading-index/p/6853031.html

Java例外:java lang NoSuchMethodError

如果查看錯誤消息java.lang.NoSuchMethodError&#xff0c;您可能會理解Java虛擬機正在嘗試向我們表明您調用的方法在類或接口中不可用。 您還可能在執行沒有公共static void main&#xff08;&#xff09;方法的類時拋出此錯誤。要了解其背后的原因&#xff0c;請閱讀本文。 …

【圖】最短路徑——Floyed算法和Dijkstra算法

最短路徑問題(floyed.cpp dijkstra.cpp) 題目描述平面上有n個點(n<100)&#xff0c;每個點的坐標均在-10000&#xff5e;10000之間。其中的一些點之間有連線。若有連線&#xff0c;則表示可從一個點到達另一個點&#xff0c;即兩點間有通路&#xff0c;通路的距離為兩點間的…

java的empty_Java Stack empty()方法與示例

堆棧類empty()方法empty()方法在java.util包中可用。empty()方法用于檢查此堆棧是否為空。empty()方法是一個非靜態方法&#xff0c;只能通過類對象訪問&#xff0c;如果嘗試使用類名稱訪問該方法&#xff0c;則會收到錯誤消息。在檢查空狀態時&#xff0c;empty()方法不會引發…

Java并發– CyclicBarrier示例

Java中的CyclicBarrier是JDK 5中java.util.Concurrent包中引入的同步器&#xff0c;以及其他并發實用程序&#xff08;如Counting Semaphore &#xff0c; BlockingQueue &#xff0c; ConcurrentHashMap等&#xff09;。CyclicBarrier與CountDownLatch類似&#xff0c;我們在上…

java i o總結_Java I/O 總結

一、IO流的三種分類方式1.按流的方向分為&#xff1a;輸入流和輸出流2.按流的數據單位不同分為&#xff1a;字節流和字符流3.按流的功能不同分為&#xff1a;節點流和處理流二、IO流的四大抽象類&#xff1a;字符流&#xff1a;Reader Writer字節流&#xff1a;InputStream(讀數…

try...catch 語句

一般情況下&#xff0c;我們很少用到 try...catch 語句&#xff0c;但是有時候為了測試代碼中的錯誤&#xff0c;也有可能會用到。小白我也在工作中用到過。那么好的程序設計&#xff0c;什么時候會用到呢&#xff1f; try...catch 一般用來捕獲宿主對象或者ECMAScript拋出的異…

用Mockito回答

在編寫單元測試時 &#xff0c;必須牢記不要依賴外部組件。 為了避免這種情況&#xff0c;我們使用了模擬框架&#xff0c;對我來說&#xff0c;最容易使用的是Mockito 。 在本文中&#xff0c;我們將看到在Mockito中使用的一種“高級”技術&#xff0c;可以使用Answer接口在模…

java三板斧_Java 枚舉使用三板斧

Java 枚舉使用三板斧1 定義public enum CountryEnums {ONE(1,"韓"),TWO(2,"魏"),THREE(3,"楚"),FOUR(4,"燕"),FIVE(5,"趙"),SIX(6,"齊");private Integer retCode;private String retMsg;// 枚舉的構造方法是 pri…

假裝這些是MyEclipse的快捷鍵(1)

Java快捷鍵 Alt / 代碼自動補全Alt Shift S 功能菜單 Ctrl 1 代碼自動修正Ctrl / 單行注釋/取消Ctrl O 查看類的所有方法Ctrl T 查看類的集成架構圖Ctrl Shift / 多行注釋Ctrl Shift \ 取消多行注釋Ctrl Shift F 代碼格式化轉載于:https://www.cnblogs.com/swordt…

JasperReports JSF插件用例–簡單列表報告

這是JasperReports JSF插件系列的第一篇“用例文章” &#xff0c;我將專注于一個簡單的需求&#xff0c;并且我將進一步深入。 起點是我們已經為圖書商店完成的項目設置&#xff0c;我將向其中添加一個列表&#xff0c;其中包含在數據庫中注冊的其他圖書&#xff0c;該列表也將…

2016.10.17先占坑

2016.10.17先占坑轉載于:https://www.cnblogs.com/amurzet/p/5978986.html

ER圖流程圖

ER圖&#xff1a;ER圖分為實體、屬性、關系三個核心部分。實體是長方形體現&#xff0c;而屬性則是橢圓形&#xff0c;關系為菱形。 圖書館管理系統流程圖&#xff08;圖片源于網上&#xff09;&#xff1a;對于程序員來說&#xff0c;我們要知道&#xff1a;整個系統中&#x…

php源碼仿三一重工,織夢仿三一重工業大學氣企業網站php源碼

★模板引薦★源碼稱呼&#xff1a;仿三一重工業大學氣企業網站php源碼仿三一重工業大學氣企業網站php源碼&#xff0c;嘗試完備無錯&#xff0c;兼容合流欣賞器。模板包括安置證明&#xff0c;并包括嘗試數據。本模板鑒于DEDECms 5.7 GBK安排&#xff0c;須要 UTF-8版本的請本人…