JavaOne 2012:Lambda之路

我最熱切期待的JavaOne 2012演講之一是Brian Goetz的“通往Lambda的道路”。 昨晚的技術主題演講中的Lambda味道僅增加了預期。 這是在希爾頓廣場A / B舉行的,距離我上次在金門大橋A / B / C參加的演講僅幾步之遙。 我原本希望打包相對較大的Plaza A / B(僅位于客廳),但是空座位卻比我預期的要多得多。

Goetz開始談論Java 8處于“成熟階段”,但尚未發布或準備交付。 他說,他希望Java 8和Lambda能夠在明年這個時候上市。 Goetz說,“您可以編寫任何值得使用Java編寫的程序”,但是Java 8將使編寫此程序變得更加容易。 他的幻燈片“現代化Java”談到Java SE 8“現代化Java語言”和“現代化Java庫”。 他在幻燈片上的最后一句話說:“這也許是Java編程模型有史以來最大的升級 。” 這就是我的感覺,這就是為什么我對這次演講沒有得到更好的參與感到驚訝的部分原因。

Goetz表示lambda表達式是“匿名方法”。 除了名稱之外,它具有方法具有的所有內容(參數列表,返回類型和主體)。 它允許您將代碼視為數據 。 方法參考引用現有方法。 Goetz重申,由于添加了lambda表達式,將導致向編寫和使用庫的巨大根本轉變。

Goetz指出,Java于1995年問世時,大多數語言都沒有閉包,但是如今,除Java之外的大多數語言都具有閉包。 然后,他在名為“ Java的封閉-漫長而曲折的道路”的幻燈片中總結了Java封閉的一些歷史。 他引用Odersky的年代和Wadler 1997年的“比薩”(1997年),Java 1.1中的內部類(1997),以及2006 - 2008年“ 轟轟烈烈的社會辯論關于關閉 ”(包括BGGA和CICE )。 Lambda項目成立于2009年12月,相關的JSR 335于2010年11月提交。今天,它“相當接近完成”。

Goetz指出,for循環“對于當今的硬件已過度指定”,同時描述了與我們今天經常使用的“外部迭代”的使用相關的“意外復雜性”。 我同意他的觀點,即“ foreach循環隱藏了客戶端和庫之間的復雜交互”。

lambda表達式的目標允許將“如何”從客戶端移至庫。 Goetz強調說,這不僅僅是語法上的更改,因為該庫受lambda表達式控制,并且是內部迭代 。 Goetz表示:“客戶處理“什么”,而圖書館處理“如何”,那是一件好事。” 他補充說,lambda表達式對我們的編碼方式尤其是對我們開發庫的方式具有深遠的影響。

Goetz討論了使用新的Java接口默認實現機制將新的forEach(Block)方法添加到集合中的方法。 Goetz區分了Java一直具有類型的多重繼承(可以實現多個接口),現在(Java 8)將具有行為的多重繼承(可用于接口的默認方法實現),但仍然不會具有狀態的多重繼承(他將其描述為最危險的)。 戈茨有一張幻燈片專門用來解釋當您從多重繼承中取出日期(狀態)時為什么“ 鉆石容易”。

Goetz的幻燈片很好,總結了“默認方法-繼承規則”。 這張幻燈片介紹了三個規則。 他指出,“如果無法通過規則解決默認問題,則子類必須實現它。” Goetz指出,接口可以提供“弱”的默認實現,而子類可以提供更好的實現。

接口上默認方法的另一個優點是,默認實現可以為可選方法引發異常(例如UnsupportedOperationException ),這樣,未實現可選行為的子類就無需執行其他任何操作。 Goetz還展示了Lambda表達式如何使Comparator可以添加reverse()和compose()方法。

Goetz展示了一些代碼示例,這些示例說明了lambda表達式允許使用“更干凈”和“更自然”的表示形式。 用他的話說,由于lambda表達式驅動的操作具有可組合性,因此“代碼讀起來就像問題聲明”。 客戶端中也沒有任何可變狀態。

我計劃將來在Goetz的一張幻燈片中引用一句話:“懶惰可以更有效。” 這樣的上下文是,如果您不打算使用所有結果,那么懶惰會更有效,因為一旦確定了匹配項,您就可以停止尋找。 流操作要么是中間的(延遲),要么是最終的(自然而然)。

Stream是一種引入的抽象,允許添加批量操作,并且“表示值的流”。 Goetz的項目符號警告說,Stream是“不是數據結構”并且“不存儲值”。 這樣做的目的是避免在設置過程中產生噪音,并嘗試更加“流暢”。

格茨表示,“ Java的朋友之一一直是庫。” 他談到了lambda表達式如何在Java庫中實現更大的并行度。 Goetz表示fork-join功能強大,但不一定易于使用。 Goetz強調:“編寫串行代碼很容易; 編寫并行代碼真是麻煩。” Lambda表達式仍然需要并行性才能明確,但對于lambda表達式及其對庫的影響應不加干擾。

為了強調Project Lambda對庫中并行性的影響,Goetz展示了一個令人痛苦的幻燈片,其中介紹了今天如何使用fork-join與集合進行并行求和,然后另一個幻燈片顯示了lambda表達式的使用更加簡單。 重點是:帶有lambda表達式的代碼要少得多,從而使業務邏輯在整個代碼中所占的比例更大。

格茨(Goetz)將Spliterator稱為“ Iterator的并行模擬”。 拆分器的規定行為可用于任何知道如何拆分自身的對象( Spliterable )。

幻燈片“ Lambdas支持更好的API”使lambda表達式對標準Java API產生了強大而受歡迎的效果。 他強調,“對API的關鍵影響是可組合性

Goetz表示,出于多種原因(例如成本更低,風險更低等),我們通常更喜歡通過庫而不是語言語法來發展編程模型。他在總結演講時指出,時代已經改變,而Java不再支持閉包。

一位與會者詢問為什么lambda表達式方法支持是在集合上而不是迭代器上。 Goetz表示,盡管C#確實從迭代器方法開始使用它,但他的團隊發現,對于開發人員而言,在集合上而不是在迭代器上使用方法的混亂程度降低了。

在回答另一個問題時,Goetz表示,由于其復雜性,尚無法對lambda表達式進行反思。 為了回答另一個問題,Goetz表示,lambda表達式支持是使用invokedynamic和方法handle構建的。 這是使lambda表達式“易于編程”和“快速”的一部分工作。

另一個問題引起了Goetz的一個非常有趣的回答,其中Goetz解釋說,集合本身內部迭代的可用性意味著更少的人(庫開發人員而不是最終用戶開發人員)將會遇到迭代復雜性。 Goetz鼓勵與會者運行當前可用的Java 8 drop,以幫助確定Lambda表達式是否得到正確處理。 Goetz表示:“我們從社區中獲得的最有價值的貢獻是人們說,'我嘗試了一下,發現了這個bug。”

Goetz在開始此演示時指出,這是在以前的JavaOne會議和其他有關lambda狀態的會議中的一連串演講。 但是,與此不同的是,Lambda項目“幾乎在那兒”,考慮到這一點,似乎語法和概念在很大程度上已經就位。 歡迎對API和語法進行這種明顯的固化,并且此演示文稿滿足了我對此的很高期望。

別忘了分享!

參考: JavaOne 2012:Lambda之路,來自JCG合作伙伴 Dustin Marx, 來自Inspired by Actual Events博客。


翻譯自: https://www.javacodegeeks.com/2012/10/javaone-2012-road-to-lambda.html

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

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

相關文章

沉浸式go-cache源碼閱讀!

大家好,我是豆小匠。 這期來閱讀go-cache的源碼,了解本地緩存的實現方式,同時掌握一些閱讀源碼的技巧~ 1. 源碼獲取 git clone https://github.com/patrickmn/go-cache.git用Goland打開可以看到真正實現功能的也就兩個go文件,ca…

CoreAnimation 變換

CoreAnimation 變換 CoreAnimation 目錄 博客園MakeDown支持不佳,如有需要請進GitHub 本片博客主要內容: 仿射變換 - CGAffineTransform3D變換 - CATransform3D仿射變換 - CGAffineTransform CGAffineTransform 是用于二維空間的旋轉,縮放和平移的屬性.首先展示一個簡單的樣例,…

20170907wdVBA_GetCellsContentToExcel

WORD 加載項 代碼模板 Dim cmdBar As CommandBar, cmdBtn As CommandBarControl Const cmdBtnCap As String "批量提取操作步驟"Sub AutoExec()Call DelCmdBtnCall AddCmdBtnEnd Sub Sub AutoExit()Call DelCmdBtn End SubSub AddCmdBtn()Set cmdBar Application.C…

mysql 5.7 mirror_Centos7 Docker離線部署Mysql5.7

1 環境信息查看系統內核[rootlocalhost /]# cat /etc/redhat-releaseCentOS Linux release 7.5.1804 (Core)2 虛擬機拉取鏡像此處資源獲取在虛擬機中進行,完成后上傳到服務器安裝2.1 拉取mysql5.7鏡像[rootlocalhost /]# docker pull mysql:5.72.2 導出鏡像[rootloc…

Java中的簡單REST客戶端

如今,大多數用于與某些服務器通信的移動應用程序都使用REST服務。 這些服務也是與JavaScript或jQuery一起使用的常見做法。 現在,我知道在Java中為REST服務創建客戶端的2種方法,在本文中,我將嘗試演示這兩種方法,希望它…

3.20 下午

閱讀《藝術學概論》 戲劇沖突是戲劇的靈魂 沖突包括:人物性格的沖突、行為的沖突、 思想感情的沖突乃至心理狀態的沖突等等 轉載于:https://www.cnblogs.com/bgd140206110/p/6590005.html

華為root工具_華為Mate9解鎖后無法ROOT 需要手動刷入Recovery怎么辦【解決方法】...

很多朋友手機到手之后,都希望能夠ROOT使用更多的系統功能。近日有網友向小編詢問,為何華為Mate9解鎖后無法ROOT,明明已經通過官方的解鎖教程解鎖的,但是之后使用“大師”等第三方刷機工具,無法ROOT。其實ROOT的關鍵就在…

JAX-WS入門

JAX-WS代表XML Web Services的Java API。 它是一種Java編程語言API,用于創建Web服務和使用XML進行通信的客戶端。 這篇文章是JAX-WS的快速入門。 先決條件 GlassFish與Eclipse集成在一起 。 創建JAX-WS Web服務 1.在Eclipse中創建一個名為“ com.eviac.blog.jax…

canvas 圖片反色

代碼實例&#xff1a; <!DOCTYPE HTML> <html> <head><meta charset"utf-8"><title>圖片反色</title><style type"text/css">body{ background:black;}#c1{ background:white;}</style><script type&q…

python中的文件父路徑怎么表達_python中的文件父路徑怎么表達_如何在Python中訪問父目錄...

所以我有一個朋友給我的Python腳本&#xff0c;但是我沒有Python的經驗。代碼如下&#xff1a;from os import path, chdir, listdir, mkdir, getcwdfrom sys import argvfrom zipfile import ZipFilefrom time import sleep#Defines what extensions to look for within the f…

Maven的中央倉庫地址

www.mvnrepository.com轉載于:https://www.cnblogs.com/j-liu3323/p/6590435.html

Spring–添加AOP支持

我聽到了一個有關一位高級&#xff08;且酬勞頗豐&#xff09;軟件工程師的故事。 他的任務是記錄他正在研究的項目中每個控制器中的每個方法。 工程師重寫了所有控制器方法&#xff0c;因此使用如下代碼&#xff1a; RequestMapping(method RequestMethod.GET)public String …

vscode python第三方庫檢測_VSCode中使用Pylint檢查python代碼

為什么使用lint在日常開發中&#xff0c;不同開發人員會寫下不同風格的代碼&#xff0c;導致代碼可維護性變差&#xff0c;為了解決風格不一致問題&#xff0c;我們可以制定代碼規范&#xff0c;讓開發人員都遵守同樣的規范編寫代碼。在開發過程中&#xff0c;部分代碼存在質量…

Spring MVC-集成(Integration)-集成LOG4J示例(轉載實踐)

以下內容翻譯自&#xff1a;https://www.tutorialspoint.com/springmvc/springmvc_log4j.htm 說明&#xff1a;示例基于Spring MVC 4.1.6。 以下示例說明如何使用Spring Web MVC框架來觸發LOG4J。首先&#xff0c;讓我們使用Eclipse IDE&#xff0c;并按照以下步驟使用Spring W…

NUMA架構和Java

是時候部署您的應用程序了&#xff0c;期待著采購最適合負載要求的硬件。 如今&#xff0c;具有40核或80核的包裝盒非常普遍。 總體概念是更多的內核&#xff0c;更多的處理能力&#xff0c;更多的吞吐量。 但是我看到了一些相反的結果&#xff0c;表明小型的CPU密集型測試運行…

存儲過程常用技巧

我們在進行pl/sql編程時打交道最多的就是存儲過程了。存儲過程的結構是非常的簡單的&#xff0c;我們在這里除了學習存儲過程的基本結構外&#xff0c;還會學習編寫存儲過程時相關的一些實用的知識。如&#xff1a;游標的處理&#xff0c;異常的處理&#xff0c;集合的選擇等等…

vue是用a標簽打開新頁面_vue 在新窗口打開頁面并設置不同的背景

開發一個新系統&#xff0c;前端用的vue&#xff0c;vue是單體應用&#xff0c;所有頁面都在一個窗口里實現&#xff0c;但項目要求在點button鏈接后要新打開一個瀏覽器頁面&#xff0c;解決方法如下&#xff1a;1. 給此button設置新事件 click"createdefect"提交缺陷…

卡爾曼濾波的推導

卡爾曼濾波的推導1 最小二乘法在一個線性系統中&#xff0c;若\(x\)為常量&#xff0c;是我們要估計的量&#xff0c;關于\(x\)的觀測方程如下&#xff1a; \[ y Hx v \tag{1.1}\] \(H\)是觀測矩陣&#xff08;或者說算符&#xff09;&#xff0c;\(v\)是噪音&#xff0c;\(y…

Java注釋-保留

考慮一下Java批注&#xff1a; public interface AnAnnotaton {}帶有此注釋的類&#xff1a; AnAnnotaton class AnAnnotatedClass{}還有一個測試&#xff0c;檢查類中是否存在此批注&#xff1a; import static org.hamcrest.MatcherAssert.assertThat; import static org.h…

MYSQL查詢選修三門以上課程_SQL高級查詢的練習題

Student(S#,Sname,Sage,Ssex) 學生表Course(C#,Cname,T#) 課程表SC(S#,C#,score) 成績表Teacher(T#,Tname) 教師表問題&#xff1a;1、查詢“001”課程比“002”課程成績高的所有學生的學號&#xff1b;select a.S# from (select s#,score from SC where C#001) a,(select s#,s…