Java –远景JDK 8
 世界正在緩慢但肯定地發(fā)生變化。 在進(jìn)行了更改之后,使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中的語(yǔ)言。三個(gè)特定方向: 
- 生產(chǎn)率
- 性能
- 模塊化
因此,從明年開(kāi)始,java將在所有地方(移動(dòng),云,桌面,服務(wù)器等)運(yùn)行,但是會(huì)以一種改進(jìn)的方式運(yùn)行。 在接下來(lái)的內(nèi)容中,我將簡(jiǎn)短概述一下2013年的期望-緊接新年決議發(fā)布-之后,我將主要關(guān)注生產(chǎn)率方面,重點(diǎn)是項(xiàng)目lambda以及它的引入將如何影響我們的編碼方式。
生產(chǎn)率
在生產(chǎn)力方面,JDK 8的目標(biāo)是兩個(gè)主要領(lǐng)域:–集合–通過(guò)引入語(yǔ)言的文字?jǐn)U展與集合進(jìn)行交互的更便捷的方式–注釋–增強(qiáng)了對(duì)注釋的支持,允許將注釋寫在當(dāng)前非法的環(huán)境中(例如原語(yǔ))
性能
向JDK 7添加Fork / Join框架是Java朝多核CPU邁出的第一步。 JDK 8通過(guò)為Java提供閉包支持(即lambda表達(dá)式),進(jìn)一步走了這條路。 Java受影響最大的部分可能是Collections部分,閉包與新添加的接口和功能相結(jié)合,將Java容器推向了新的高度。 除了編寫更具可讀性和更短的代碼之外,通過(guò)向集合提供將在內(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。” 我使用過(guò)去式,是因?yàn)閷?duì)于那些希望擺脫類路徑和類加載器的人來(lái)說(shuō),我們不得不推遲對(duì)Java 9的使用,因?yàn)槟菚r(shí)候項(xiàng)目Jigsaw也被推遲了 。
要更清晰地了解剩余的Java路線圖2013:
- 2013/01/31 M6功能完成
- 2013/02/21 M7開(kāi)發(fā)人員預(yù)覽
- 2013/07/05 M8最終版本候選
- 2013/09/09 GA全面上市
除了項(xiàng)目拼圖之外,即將出現(xiàn)的另一個(gè)重大變化(在此版本中)是對(duì)閉包的支持。 通過(guò)lambda表達(dá)式的幫助,它們將改善JDK的關(guān)鍵點(diǎn)。
Lambdas
入門
首先,首先應(yīng)該獲得啟用了lambda的SDK。 在這個(gè)方向上,有兩種獲取方法:
*適用于勇敢者的一種:從源頭構(gòu)建
*方便的一種:下載已經(jīng)編譯的SDK版本
最初,我從源頭開(kāi)始構(gòu)建它,但是由于時(shí)間緊缺以及與環(huán)境變量有關(guān)的警告過(guò)多,我選擇了惰性方法并采用了現(xiàn)有的JDK。 另一個(gè)重要的工具是用于編寫代碼的文本編輯器。 直到現(xiàn)在,它還是最先發(fā)布了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)。
在開(kāi)始使用新提供的功能來(lái)編寫經(jīng)過(guò)改進(jìn)和簡(jiǎn)潔的代碼之前,必須先掌握幾個(gè)新概念,無(wú)論如何我還是需要的。
-  什么是lambda表達(dá)式? 查看lambda表達(dá)式的最簡(jiǎn)單方法就像一種方法:“它提供了形式參數(shù)的列表,以及根據(jù)這些參數(shù)表示的主體(表達(dá)式或塊)。lambda表達(dá)式的參數(shù)可以聲明或推斷。 ,當(dāng)形式參數(shù)具有推斷的類型時(shí),則這些類型是從lambda表達(dá)式所針對(duì)的功能接口類型派生的。 從返回值的角度來(lái)看,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è)方法。 除了通過(guò)創(chuàng)建和實(shí)例化類來(lái)創(chuàng)建接口實(shí)例的典型方式之外,還可以通過(guò)使用lambda表達(dá)式,方法或構(gòu)造函數(shù)引用來(lái)創(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因此,讓我們看看線程的開(kāi)始將來(lái)可能如何變化: 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í)間沒(méi)有編寫任何與Java Swing,AWT相關(guān)的功能,我也不得不承認(rèn)lambda將為Swing開(kāi)發(fā)人員的Action偵聽(tīng)器添加新鮮的空氣: 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!');}});
- 誰(shuí)/什么是SAM? SAM代表“單一抽象方法”,因此,為了開(kāi)一些角,我們可以說(shuō)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ì)的功能接口類型派生的。 從返回值的角度來(lái)看,lambda表達(dá)式可以是void兼容的-它們不返回任何值或值兼容-如果任何給定的執(zhí)行路徑返回值。 
Lambda聽(tīng)起來(lái)很好聽(tīng)嗎? 但是以某種方式對(duì)功能接口的需求在某種程度上受到了限制–這是否意味著我只能使用包含單個(gè)抽象方法的接口? 并非完全如此-JDK 8提供了一種別名機(jī)制,該機(jī)制允許從類或?qū)ο笾小疤崛 狈椒ā?這可以通過(guò)使用新添加的::運(yùn)算符來(lái)完成。 它可以應(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開(kāi)始,java接口可以包含方法主體,因此簡(jiǎn)單地說(shuō),java將支持多重繼承,而不會(huì)帶來(lái)通常的麻煩。 同樣,通過(guò)提供接口方法的默認(rèn)實(shí)現(xiàn),可以確保添加新方法不會(huì)在實(shí)現(xiàn)類中造成混亂。 JDK 8向java.util.Collection或java.util.Iterator之類的接口添加了默認(rèn)方法,并通過(guò)此方法提供了一種機(jī)制,可以在實(shí)際需要的地方更好地使用lambda。
值得注意的接口添加:
java.util.stream.Streamablejava.util.stream.Stream改善館藏的互動(dòng)
在我看來(lái),lambda項(xiàng)目所帶來(lái)的所有更改都是對(duì)該語(yǔ)言的極大補(bǔ)充,這將使其與當(dāng)前的標(biāo)準(zhǔn)保持一致,并使它變得更簡(jiǎn)單,更精簡(jiǎn),但這種更改可能會(huì)帶來(lái)最大的生產(chǎn)力影響和最大的挑戰(zhàn)。效果肯定是集合框架的改進(jìn)。 不,沒(méi)有Collection 2框架,我們現(xiàn)在仍然必須處理類型擦除,但是Java將做出另一個(gè)重要的轉(zhuǎn)變:從外部迭代到內(nèi)部迭代。 這樣,它為開(kāi)發(fā)人員提供了一種以優(yōu)雅的方式篩選和聚合集合的機(jī)制,除此之外還可以提高效率。 通過(guò)提供將在內(nèi)部執(zhí)行的lambda表達(dá)式,可以充分利用多核處理器的能力。 讓我們考慮以下情形:
 一個(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è)元素并打印出來(lái)該怎么辦?
//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)參見(jiàn)JDK 8 Project lambda網(wǎng)站或JSR 337的網(wǎng)頁(yè)。
總而言之,Java正在向前發(fā)展,我個(gè)人喜歡它的發(fā)展方向,另一個(gè)有趣的方面是庫(kù)開(kāi)發(fā)人員也開(kāi)始采用JDK 8的時(shí)間點(diǎn)。 那肯定會(huì)很有趣。 感謝您的時(shí)間和耐心,祝您圣誕快樂(lè)。
資源資源
 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)見(jiàn)。
翻譯自: https://www.javacodegeeks.com/2012/12/java-far-sight-look-at-jdk-8.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的Java –远景JDK 8的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        - 上一篇: 新买的电脑如何检验是否原装及真实配置情况
- 下一篇: Java 9模块系统(拼图)@ LJC的
