Java – JDK 8的远景
世界正在緩慢但肯定地發(fā)生變化。 經(jīng)過更改后,Java有了JDK 7的全新外觀,Java社區(qū)期待JDK 8(可能還有JDK 9)所帶來的其余改進(jìn)。
JDK 8的目標(biāo)目的是填補(bǔ)JDK 7實(shí)施中的空白-該實(shí)施中剩下的部分難題,應(yīng)該在2013年底之前為廣大讀者所用,目的是改善和增強(qiáng)JDK 7中的語言。三個(gè)特定方向:
- 生產(chǎn)率
- 性能
- 模塊化
因此,從明年開始,java將在所有地方(移動(dòng),云,桌面,服務(wù)器等)運(yùn)行,但是會(huì)以一種改進(jìn)的方式運(yùn)行。 在接下來的內(nèi)容中,我將簡(jiǎn)短概述一下2013年的預(yù)期-緊接新年決議發(fā)布-之后,我將主要關(guān)注生產(chǎn)率方面,重點(diǎn)是項(xiàng)目lambda以及它的引入將如何影響我們的編碼方式。
生產(chǎn)率
在生產(chǎn)力方面,JDK 8的目標(biāo)是兩個(gè)主要領(lǐng)域:–集合–通過引入語言的文字?jǐn)U展與集合進(jìn)行交互的一種更便捷的方式–注釋–增強(qiáng)了對(duì)注釋的支持,允許在當(dāng)前非法的環(huán)境(例如基元)中編寫注釋
性能
向JDK 7添加Fork / Join框架是Java朝多核CPU邁出的第一步。 JDK 8通過為Java提供閉包支持(即lambda表達(dá)式),進(jìn)一步走了這條路。 Java受影響最大的部分可能是Collections部分,其閉包與新添加的接口和功能將Java容器推向了新的高度。 除了要編寫的更具可讀性和更短的代碼之外,通過向集合提供將在內(nèi)部執(zhí)行的lambda表達(dá)式,平臺(tái)可以利用多核處理器。
模塊化
社區(qū)中最令人感興趣的作品之一是項(xiàng)目拼圖:“該項(xiàng)目的目標(biāo)是為Java SE平臺(tái)設(shè)計(jì)和實(shí)現(xiàn)標(biāo)準(zhǔn)模塊系統(tǒng),并將該系統(tǒng)應(yīng)用于平臺(tái)本身和JDK。” 我使用過去式,是因?yàn)閷?duì)于那些希望擺脫類路徑和類加載器的人來說,我們不得不推遲對(duì)Java 9的使用,因?yàn)槟菚r(shí)候項(xiàng)目Jigsaw也被推遲了 。
要更清晰地了解如何重新發(fā)布Java Roadmap 2013:
- 2013/01/31 M6功能完成
- 2013/02/21 M7開發(fā)人員預(yù)覽
- 2013/07/05 M8最終版本候選
- 2013/09/09 GA全面上市
除了項(xiàng)目拼圖之外,即將出現(xiàn)的另一個(gè)重大變化(在此版本中)是對(duì)閉包的支持。 通過lambda表達(dá)式的幫助,它們將改善JDK的關(guān)鍵點(diǎn)。
Lambdas
入門
首先,首先應(yīng)該獲得啟用了lambda的SDK。 在這個(gè)方向上,有兩種獲取方法:
*面向勇敢者的一種:從源頭構(gòu)建
*方便的一種:下載已經(jīng)編譯的SDK版本
最初,我從源頭開始構(gòu)建它,但是由于時(shí)間緊缺以及與環(huán)境變量有關(guān)的警告過多,我選擇了惰性方法并采用了現(xiàn)有的JDK。 另一個(gè)重要的工具是用于編寫代碼的文本編輯器。 直到現(xiàn)在為止,它是最早出現(xiàn)的JDK版本,并在一段時(shí)間后啟用了IDE。 這次有所不同,這也許是由于openjdk提供的SDK的透明性和廣泛可用性。 幾天前,JetBrain實(shí)現(xiàn)了第一個(gè)啟用Java 8的IDE。 因此IntelliJ IDEA 版本 12是第一個(gè)提供對(duì)JDK 8支持的IDE,此外還有改進(jìn)之處嗎? 因此,出于測(cè)試目的,我在Windows 7,x64計(jì)算機(jī)上將IntelliJ 12 Community Edition與JDK 8 b68一起使用。 對(duì)于那些喜歡Netbeans的人,可以下載具有l(wèi)ambda支持的每晚構(gòu)建。
調(diào)整為適當(dāng)?shù)男膽B(tài)。
在開始使用新提供的功能來編寫經(jīng)過改進(jìn)和簡(jiǎn)潔的代碼之前,必須先掌握幾個(gè)新概念,無論如何我還是需要的。
- 什么是lambda表達(dá)式? 查看lambda表達(dá)式的最簡(jiǎn)單方法就像一種方法:“它提供了形式參數(shù)的列表,以及根據(jù)這些參數(shù)表示的主體(表達(dá)式或塊)。lambda表達(dá)式的參數(shù)可以聲明或推斷。 ,當(dāng)形式參數(shù)具有推斷的類型時(shí),則這些類型是從lambda表達(dá)式所針對(duì)的功能接口類型派生的。 從返回值的角度來看,lambda表達(dá)式可以是void兼容的-它們不返回任何值或值兼容-如果任何給定的執(zhí)行路徑返回值。
lambda表達(dá)式的示例:
(a) (int a, int b) -> a + b(b) (int a, int b) -> {if (a > b) {return a;} else if (a == b) {return a * b;} else {return b;}} - 什么是功能接口? 功能接口是僅包含一個(gè)抽象方法的接口,因此表示單個(gè)方法協(xié)定。 在某些情況下,單個(gè)方法可能具有帶有覆蓋等效簽名的多個(gè)方法,在這種情況下,所有方法都代表一個(gè)方法。 除了通過創(chuàng)建和實(shí)例化類來創(chuàng)建接口實(shí)例的典型方式之外,還可以通過使用lambda表達(dá)式,方法或構(gòu)造函數(shù)引用來創(chuàng)建功能接口實(shí)例。
功能接口示例: // custom built functional interface public interface FuncInterface {public void invoke(String s1, String s2); }JAVA API的功能接口示例:
java.lang.Comparablejava.lang.Runnablejava.util.concurrent.Callablejava.awt.event.ActionListener因此,讓我們看看線程的開始在將來可能會(huì)發(fā)生什么變化:
new Thread(new Runnable() {@Overridepublic void run() {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}}).start();
舊方法:新方法:
new Thread(() -> {for (int i=0; i< 9; i++) {System.out.println(String.format('Message #%d from inside the thread!', i));}}).start();即使我有一段時(shí)間沒有編寫任何與Java Swing,AWT相關(guān)的功能,我也不得不承認(rèn)lambda將為Swing開發(fā)人員的Action偵聽器添加新鮮空氣:
JButton button = new JButton('Click');// NEW WAY:button.addActionListener( (e) -> {System.out.println('The button was clicked!');});// OLD WAY:button.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println('The button was clicked using old fashion code!');}}); - 誰/什么是SAM? SAM代表“單一抽象方法”,因此可以說一些捷徑可以說是SAM ==功能接口。 即使在最初的規(guī)范中,也將僅具有一種抽象方法的抽象類也視為SAM類型,一些人還是發(fā)現(xiàn)/猜測(cè)了原因。
- 方法/構(gòu)造函數(shù)引用
- 什么是lambda表達(dá)式? 查看lambda表達(dá)式的最簡(jiǎn)單方法就像一種方法:“它提供了形式參數(shù)的列表,以及根據(jù)這些參數(shù)表示的主體(表達(dá)式或塊)。lambda表達(dá)式的參數(shù)可以聲明或推斷。 ,當(dāng)形式參數(shù)具有推斷的類型時(shí),則這些類型是從lambda表達(dá)式所針對(duì)的功能接口類型派生的。 從返回值的角度來看,lambda表達(dá)式可以是void兼容的-它們不返回任何值或值兼容-如果任何給定的執(zhí)行路徑返回值。
Lambda聽起來很好聽嗎? 但是以某種方式對(duì)功能接口的需求在某種程度上受到了限制–這是否意味著我只能使用包含單個(gè)抽象方法的接口? 并非完全如此-JDK 8提供了一種別名機(jī)制,該機(jī)制允許從類或?qū)ο笾小疤崛 狈椒ā?這可以通過使用新添加的::運(yùn)算符來完成。 它可以應(yīng)用于類–用于提取靜態(tài)方法,也可以應(yīng)用于對(duì)象以提取方法。 相同的運(yùn)算符也可以用于構(gòu)造函數(shù)。
引用:
interface ConstructorReference{T constructor(); }interface MethodReference {void anotherMethod(String input); }public class ConstructorClass {String value;public ConstructorClass() {value = 'default';}public static void method(String input) {System.out.println(input);}public void nextMethod(String input) {// operations}public static void main(String... args) {// constructor referenceConstructorReferencereference = ConstructorClass::new;ConstructorClass cc = reference.constructor();// static method referenceMethodReference mr = cc::method;// object method referenceMethodReference mr2 = cc::nextMethod;System.out.println(cc.value);} }- 接口中的默認(rèn)方法
這意味著從版本8開始,java接口可以包含方法主體,因此簡(jiǎn)單地說,java將支持多重繼承,而不會(huì)帶來通常的麻煩。 同樣,通過提供接口方法的默認(rèn)實(shí)現(xiàn),可以確保添加新方法不會(huì)在實(shí)現(xiàn)類中造成混亂。 JDK 8向java.util.Collection或java.util.Iterator之類的接口添加了默認(rèn)方法,并通過此方法提供了一種在實(shí)際需要的地方更好地使用lambda的機(jī)制。
值得注意的接口添加:
java.util.stream.Streamablejava.util.stream.Stream改善館藏的互動(dòng)
在我看來,lambda項(xiàng)目所帶來的所有更改都是對(duì)語言的重大補(bǔ)充,這將使其與當(dāng)前的標(biāo)準(zhǔn)保持一致,并使之更簡(jiǎn)單,更精簡(jiǎn),但可能會(huì)對(duì)生產(chǎn)力產(chǎn)生最大的影響,并且最大的好處是+效果肯定是集合框架的改進(jìn)。 不,沒有Collection 2框架,我們現(xiàn)在仍然需要處理類型擦除,但是Java將做出另一個(gè)重要的轉(zhuǎn)變:從外部迭代到內(nèi)部迭代。 這樣,它為開發(fā)人員提供了一種以優(yōu)雅的方式過濾和聚合集合的機(jī)制,此外還可以提高效率。 通過提供將在內(nèi)部執(zhí)行的lambda表達(dá)式,可以充分利用多核處理器的功能。 讓我們考慮以下情形:
一個(gè)。 考慮一個(gè)字符串列表,選擇所有大寫的字符串。 怎么寫?
舊方法:
//….. 新方法:
//.....inputList.stream().filter(x -> (x != null && x.matches('[A-Z0-9]*'))).into(upper);b。 考慮您想將所有提取的字符更改為小寫。 使用JDK8的方式如下所示:
// .....inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::toLowerCase).into(upper);C。 以及如何從所選集合中找出字符數(shù)
// ..... int sumX = inputList.stream().filter(x -> (x != null && x.matches("[A-Z0-9]*"))).map(String::length).reduce(0, Integer::sum);使用的方法:
default Streamstream() // java.util.CollectionStreamfilter(Predicate predicate) // java.util.stream.StreamIntStream map(IntFunction mapper) //java.util.stream.Streamd。 如果我想從集合中獲取每個(gè)元素并打印出來怎么辦?
//OLD WAY: for (String current : list) {System.out.println(current); }//NEW WAY:list.forEach(x -> System.out.println(x));除了提到的功能之外,JDK 8還有其他有趣的消息,但是出于簡(jiǎn)潔的原因,我將在這里停止。 有關(guān)它的更多信息,請(qǐng)參見JDK 8 Project lambda網(wǎng)站或JSR 337的網(wǎng)頁。
總而言之,Java正在向前發(fā)展,我個(gè)人喜歡它的發(fā)展方向,另一個(gè)興趣點(diǎn)是庫(kù)開發(fā)人員也開始采用JDK 8的時(shí)間點(diǎn)。 那肯定會(huì)很有趣。 謝謝您的時(shí)間和耐心,祝您圣誕快樂。
資源資源
Brian Goetz資源文件夾:
http://cr.openjdk.java.net/~briangoetz/lambda
方法/構(gòu)造方法參考:
http://doanduyhai.wordpress.com/2012/07/14/java-8-lambda-in-details-part-iii-method-and-constructor-referencing
參考: Java –我們的JCG合作伙伴 Olimpiu Pop在Java Advent Calendar博客上對(duì)JDK 8的遠(yuǎn)見。
翻譯自: https://www.javacodegeeks.com/2012/12/java-far-sight-look-at-jdk-8.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java – JDK 8的远景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 海信展示 120 英寸折叠屏激光电视,可
- 下一篇: 功能性Java集合