番石榴函數和Java 8 Lambdas

我最近閱讀了Brian Goetz的《 Lambda的狀況》 ,在閱讀了該文章之后,我想嘗試使用Java 8 Lambda表達式。 Brian在他的文章中繼續描述了將一種方法稱為“功能”接口的接口。 功能接口幾乎總是用作匿名類,其中ActionListener是規范示例。 這些“功能性”界面是lambda表達式的最初目標,主要目標是刪除許多使用它們的樣板或儀式。 當我在Guava庫上編寫系列文章時,立即想到了Function接口,它是嘗試使用lambda表達式的主要候選對象。

我的目標很簡單,從我的Guava Futures博客中進行單元測試(它大量使用Function接口)并將其轉換為使用lambda表達式。 雖然我將介紹與所舉示例有關的lamba表達式的結構,但本文并非是有關Java 8 lambda表達式的教程。 而是記錄了我在Java中使用lambda表達式的首次嘗試。

Lambda表達式

第一個示例是對Futures.chain方法的測試,該方法將Function作為參數之一:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =new Function<List<String>, ListenableFuture<List<Person>>>() {@Overridepublic ListenableFuture<List<Person>> apply(final List<String> ids) {return dbService.getPersonsByIdAsync(ids);}};ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');
ListenableFuture<List<Person>> results = Futures.chain(indexSearch,queryFunction,executorService);

使用lamba表達式,現在看起來像:

Function<List<String>, ListenableFuture<List<Person>>> queryFunction =ids ->(dbService.getPersonsByIdAsync(ids));ListenableFuture<List<String>> indexSearch = luceneSearcher.searchAsync('firstName:martin');ListenableFuture<List<Person>>results = Futures.chain(indexSearch, queryFunction,executorService);

請記住,在上面的代碼示例中,兩個突出顯示的部分是等效的。 讓我們看一下第2行,并說明它如何與第一個代碼示例中的1-7行匹配

  1. ids是apply方法的輸入,并且對應于第一個代碼示例中第4行的final List<String> ids參數。 lamba表達式的類型是從使用它的上下文中推斷出來的,因此我們不需要為ids參數重復它們。
  2. 然后是箭頭(->)令牌,它是當前形式的Java 8 lambda表達式的常規語法的一部分
  3. 然后,我們得到了lambda的主體(dbService.getPersonsByIdAsync(ids)),該主體是一個方法調用,該方法返回一個ListenableFuture,進而產生一個Person對象列表。 請注意,我們不必放入return語句,因為這是一個表達式,可以求值并返回。

下一個示例是測試中的實用程序方法,該方法通過將匿名Callable實例傳遞到ExecutorService中來返回ListenableFutures:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {
return executorService.submit(new Callable<List<Person>>() {@Overridepublic List<Person> call() throws Exception {startSignal.await();if (error) {throw new RuntimeException('Ooops!');}List<String> ids = luceneSearcher.search('firstName:' + firstName);return dbService.getPersonsById(ids);}});
}

這是使用lambda表達式的等效項:

private ListenableFuture<List<Person>> getPersonsByFirstNameFuture(final String firstName, final boolean error) {return executorService.submit(() -> {startSignal.await();if (error) {throw new RuntimeException('Ooops!');}List<String> ids = luceneSearcher.search('firstName:' + firstName);return dbService.getPersonsById(ids);});
}

在此示例中,沒有輸入參數,因此表達式在第2行以空括號()開頭。存在->標記,但是在此示例中,主體包含由{…}包圍的多個語句。 由于存在多個語句,因此在第7行需要顯式return語句。

運行Java 8的環境

我當前的筆記本電腦是MacBook Pro,因此我需要設置一個環境以運行具有lambda支持的Java 8。 這是我采取的步驟:

  1. 在VirtualBox上安裝了LinuxMint 12。
  2. 創建一個目錄并與LinuxMint來賓共享
  3. 安裝了Java 8的開發人員預覽版 。
  4. 為了從現有的maven項目中獲取源代碼并測試源代碼,我運行了mvn jar:jar jar:test-jar并將生成的jar文件放在共享目錄中
  5. 將所有依賴項放在共享目錄中(guava,lucene,h2和junit)
  6. 重新編寫單元測試以使用lambda,并從命令行運行新測試

結論

盡管要發布支持lambda的Java 8尚需時日,但開發人員預覽版中提供的功能似乎很有希望。感謝您的時間,一如既往地歡迎提出意見和建議

資源資源

  • Lambda的狀態,第4部分
  • Java 8開發人員預覽
  • 這篇文章的源代碼
  • 番石榴項目首頁
  • Guava博客系列的源代碼


參考:來自我們的JCG合作伙伴 Bill Bejeck的Guava Functions&Java 8 Lambdas,來自“ 隨機編碼思考”博客。

翻譯自: https://www.javacodegeeks.com/2012/11/guava-functions-java-8-lambdas.html

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

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

相關文章

linux rsync刪文件速度,為什么用rsync刪除大量文件的時候比用rm快

為什么用rsync刪除大量文件的時候比用rm快今天研究怎么在Linux下快速刪除大量文件&#xff0c;搜到很多人都說可以用rsync來刪除大量文件&#xff0c;速度比rm要快很多&#xff0c;但是沒有人說為什么&#xff0c;仔細研究了一下原因&#xff0c;總結起來大概就是&#xff0c;一…

關于源碼,反碼,補碼(正數--負數)---------(-128)自己的理解

以一個字節為例 1、無符號位&#xff0c;一個字節可以存放0~255共256個數字&#xff1b;有符號位存放-128~127共256個數字&#xff1b; 2、無符號全都表示為正數&#xff1b;有符號位則首位表示正負數&#xff0c;正數首位為0&#xff0c;負數首位為1&#xff08;因此在判斷一個…

英特爾x722網卡驅動_產品詳情 | 從核心到邊緣,英特爾加速5G網絡基礎設施建設...

英特爾近期宣布推出無可比擬的5G基礎設施芯片產品組合&#xff0c;包括一款面向無線基站的10納米片上系統(SoC)英特爾凌動P5900&#xff0c;和一款面向5G網絡處理的結構化ASIC&#xff0c;一款針對5G網絡優化、提供基于GPS的高精度網絡服務同步功能的以太網適配器。此外&#x…

canvas離屏技術與放大鏡實現

教程所示圖片使用的是 github 倉庫圖片&#xff0c;網速過慢的朋友請移步>>> &#xff08;原文&#xff09;canvas 離屏技術與放大鏡實現。 更多討論或者錯誤提交&#xff0c;也請移步。 利用canvas除了可以實現濾鏡&#xff0c;還可以利用離屏技術放大鏡功能。為了方…

虛擬機下安裝ubuntu后root密碼設置

問題描述&#xff1a; 在虛擬機下安裝了ubuntu中要輸入用戶名&#xff0c;一般情況下大家都會輸入一個自己的網名或綽號之類的&#xff0c;密碼也在這時設置過了。 但是當安裝成功之后&#xff0c;使用命令#su root&#xff0c;然后輸入剛才設置的密碼&#xff0c;發現密碼錯誤…

使用Ajax的Spring MVC REST調用

這篇文章提供了對Spring MVC Web應用程序的REST調用的簡單示例。 它基于在Spring MVC上下文示例中使用Spring MVC服務靜態資源和使用Ajax獲取JSON 。 該代碼可在GitHub的Spring-REST-With-Ajax目錄中找到。 主頁 我們的主頁包含與執行Ajax調用的Javascript函數鏈接的四個按鈕…

團隊作業—預則立他山之石

團隊作業—預則立&&他山之石 Deadline: 2017.10.24 22:00pm 作業要求 一、確立團隊選題&#xff0c;建立和初步熟悉團隊git的協作方式。項目后續的代碼、文檔都要通過github增量式管理。實現文檔的版本化和增量式管理。 二、初步確立團隊任務計劃&#xff0c;將團隊的任…

linux7系統如何配置網卡,Linux 7 配置網卡(nmcli)

操作系統版本&#xff1a;[rootcjcos01 network-scripts]# cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.5 (Maipo)查看網卡、IP等信息&#xff1a;[rootcjcos01 ~]# ifconfigenp0s3: flags4163 mtu 1500inet 192.168.1.90 netmask 255.255.255.0 bro…

學以致用深入淺出數字信號處理 pdf_數字陣列雷達--相控陣專題講座之三

數字陣列雷達-相控陣專題講座之三https://www.zhihu.com/video/1218562626877583360從名詞上看&#xff0c;數字陣列雷達&#xff0c;肯定是陣列雷達了&#xff0c;那么數字陣列與傳統的相控陣雷達又有什么區別呢&#xff1f;傳統的相控陣雷達&#xff0c;是依靠移相器、衰減器…

Ubuntu中右擊出現終端

1 root用戶 $sudo apt-get install nautilus-open-terminal 2重啟 3ok 轉載于:https://www.cnblogs.com/lanjianhappy/p/6761599.html

MapReduce:處理數據密集型文本處理–局部聚合第二部分

這篇文章繼續進行有關使用MapReduce進行數據密集型處理的書中實現算法的系列文章。 第一部分可以在這里找到。 在上一篇文章中&#xff0c;我們討論了使用本地聚合技術來減少通過網絡進行混洗和傳輸的數據量的方法。 減少傳輸的數據量是提高MapReduce作業效率的主要方法之一。 …

python爬蟲需要什么知識-學習Python爬蟲技術,需要掌握哪些web端的知識?

HTML5&#xff1a;html概述和基本結構、html標題標簽、html段落標簽、換行標簽、塊標簽、圖片標簽、a鏈接標簽、列表標簽、表格、表單、頁面布局等。 CSS3&#xff1a;CSS基本語法和頁面引用、CSS文本設置、顏色表示法、CSS選擇器、盒子模型、盒子模型實際尺寸、浮動、四大定位…

UDP學習總結

1、UDP的優勢是什么&#xff1f;有哪些典型的應用是使用UDP的&#xff1f;為什么&#xff1f; 2、轉載于:https://www.cnblogs.com/zhouhaibing/p/7669251.html

Linux版本的SVN客戶端,linux 下安裝 subversion(svn) 客戶端

svn server 為只支持http://協議的windows;test web server 為as4,現需安裝svn客戶端方便同步代碼網上找了下都是講如何安裝svn server的&#xff0c;我只需要一個支持http協議的客戶端哈&#xff0c;不想裝apache。安裝所需軟件apr,apr-util,sqlite,neon,subversion1.下載軟件…

使用bootstrap的dropdown部件時報錯:error:Bootstrap dropdown require Popper.js

前言&#xff1a;前端小白一枚&#xff0c;剛注冊博客&#xff0c;先發個學習過程中新碰到小問題試試水吧~ 摘要&#xff1a;最近在學習bootstrap&#xff0c;偶然碰到了一個小問題&#xff0c;bootstrap網站也沒有做過多的解釋&#xff0c;今天分享給大家。 問題描述&#x…

C#中的三層

三層架構(3-tier architecture) 通常意義上的三層架構就是將整個業務應用劃分為&#xff1a;界面層&#xff08;User Interface layer&#xff09;、業務邏輯層&#xff08;Business Logic Layer&#xff09;、數據訪問層&#xff08;Data access layer&#xff09;。區分層次的…

研究僵局–第3部分

在本系列的前兩個博客&#xff08; 第1部分和第2部分&#xff09;中 &#xff0c;我演示了如何創建一段死鎖的不良代碼&#xff0c;然后使用該代碼展示了進行線程轉儲的三種方式。 在這個博客中&#xff0c;我將分析線程轉儲以找出錯誤的原因。 下面的討論同時涉及本系列第1部…

qq2009顯ip版怎么用_毛孔粗大怎么破?用對方法,輕松改善顯皮膚嫩滑

臉上毛孔粗大怎么破&#xff1f;超級煩惱尤其是一到秋季臉上經常油膩膩的為什么會毛孔粗大呢&#xff1f;毛孔粗大怎么破&#xff1f;用對方法&#xff0c;輕松改善顯皮膚嫩滑 當皮膚老舊角質積聚越多&#xff0c;會使肌膚變厚、變粗糙&#xff0c;毛孔變粗大&#xff0c;肌膚也…

linux 賬號密碼 字段,詳解Linux中的用戶密碼管理命令passwd和change

passwd修改用戶密碼參數-k 保持未過期身份驗證令牌-l 關閉賬號密碼。效果相當于usermod -L&#xff0c;只有root才有權使用此項。-u 恢復賬號密碼。效果相當于usermod -U&#xff0c;同樣只有root才有權使用。-g 修改組密碼。gpasswd的等效命令。-f 更改由finger命令訪問的用戶…

hello程序的運行過程-從計算機系統角度

hello程序的運行過程-從計算機系統角度 1、gcc編譯器驅動程序讀取源程序文件hello.c&#xff0c;并將它翻譯成一個可執行目標文件hello。翻譯過程分為四個階段&#xff1a;預處理階段&#xff0c;編譯階段&#xff0c;匯編階段&#xff0c;鏈接階段。 2、初始時&#xff0c;she…