Java – JDK 8的遠景

世界正在緩慢但肯定地發生變化。 經過更改后,Java有了JDK 7的全新外觀,Java社區期待JDK 8(可能還有JDK 9)所帶來的其余改進。
JDK 8的目標目的是填補JDK 7實施中的空白-該實施中剩下的部分難題,應該在2013年底之前為廣大讀者所用,目的是改善和增強JDK 7中的語言。三個特定方向:

  • 生產率
  • 性能
  • 模塊化

因此,從明年開始,java將在所有地方(移動,云,桌面,服務器等)運行,但是會以一種改進的方式運行。 在接下來的內容中,我將簡短概述一下2013年的預期-緊接新年決議發布-之后,我將主要關注生產率方面,重點是項目lambda以及它的引入將如何影響我們的編碼方式。

生產率

在生產力方面,JDK 8的目標是兩個主要領域:–集合–通過引入語言的文字擴展與集合進行交互的一種更便捷的方式–注釋–增強了對注釋的支持,允許在當前非法的環境(例如基元)中編寫注釋

性能

向JDK 7添加Fork / Join框架是Java朝多核CPU邁出的第一步。 JDK 8通過為Java提供閉包支持(即lambda表達式),進一步走了這條路。 Java受影響最大的部分可能是Collections部分,其閉包與新添加的接口和功能將Java容器推向了新的高度。 除了要編寫的更具可讀性和更短的代碼之外,通過向集合提供將在內部執行的lambda表達式,平臺可以利用多核處理器。

模塊化

社區中最令人感興趣的作品之一是項目拼圖:“該項目的目標是為Java SE平臺設計和實現標準模塊系統,并將該系統應用于平臺本身和JDK。” 我使用過去式,是因為對于那些希望擺脫類路徑和類加載器的人來說,我們不得不推遲對Java 9的使用,因為那時候項目Jigsaw也被推遲了 。

要更清晰地了解如何重新發布Java Roadmap 2013:

  • 2013/01/31 M6功能完成
  • 2013/02/21 M7開發人員預覽
  • 2013/07/05 M8最終版本候選
  • 2013/09/09 GA全面上市

除了項目拼圖之外,即將出現的另一個重大變化(在此版本中)是對閉包的支持。 通過lambda表達式的幫助,它們將改善JDK的關鍵點。

Lambdas

入門

首先,首先應該獲得啟用了lambda的SDK。 在這個方向上,有兩種獲取方法:

*面向勇敢者的一種:從源頭構建

*方便的一種:下載已經編譯的SDK版本

最初,我從源頭開始構建它,但是由于時間緊缺以及與環境變量有關的警告過多,我選擇了惰性方法并采用了現有的JDK。 另一個重要的工具是用于編寫代碼的文本編輯器。 直到現在為止,它是最早出現的JDK版本,并在一段時間后啟用了IDE。 這次有所不同,這也許是由于openjdk提供的SDK的透明性和廣泛可用性。 幾天前,JetBrain實現了第一個啟用Java 8的IDE。 因此IntelliJ IDEA 版本 12是第一個提供對JDK 8支持的IDE,此外還有改進之處嗎? 因此,出于測試目的,我在Windows 7,x64計算機上將IntelliJ 12 Community Edition與JDK 8 b68一起使用。 對于那些喜歡Netbeans的人,可以下載具有lambda支持的每晚構建。

調整為適當的心態。

在開始使用新提供的功能來編寫經過改進和簡潔的代碼之前,必須先掌握幾個新概念,無論如何我還是需要的。

    • 什么是lambda表達式? 查看lambda表達式的最簡單方法就像一種方法:“它提供了形式參數的列表,以及根據這些參數表示的主體(表達式或塊)。lambda表達式的參數可以聲明或推斷。 ,當形式參數具有推斷的類型時,則這些類型是從lambda表達式所針對的功能接口類型派生的。 從返回值的角度來看,lambda表達式可以是void兼容的-它們不返回任何值或值兼容-如果任何給定的執行路徑返回值。
      lambda表達式的示例:
      (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;}}
    • 什么是功能接口? 功能接口是僅包含一個抽象方法的接口,因此表示單個方法協定。 在某些情況下,單個方法可能具有帶有覆蓋等效簽名的多個方法,在這種情況下,所有方法都代表一個方法。 除了通過創建和實例化類來創建接口實例的典型方式之外,還可以通過使用lambda表達式,方法或構造函數引用來創建功能接口實例。
      功能接口示例:
      // 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

      因此,讓我們看看線程的開始在將來可能會發生什么變化:
      舊方法:

      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();

      即使我有一段時間沒有編寫任何與Java Swing,AWT相關的功能,我也不得不承認lambda將為Swing開發人員的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 ==功能接口。 即使在最初的規范中,也將僅具有一種抽象方法的抽象類也視為SAM類型,一些人還是發現/猜測了原因。
    • 方法/構造函數引用

Lambda聽起來很好聽嗎? 但是以某種方式對功能接口的需求在某種程度上受到了限制–這是否意味著我只能使用包含單個抽象方法的接口? 并非完全如此-JDK 8提供了一種別名機制,該機制允許從類或對象中“提取”方法。 這可以通過使用新添加的::運算符來完成。 它可以應用于類–用于提取靜態方法,也可以應用于對象以提取方法。 相同的運算符也可以用于構造函數。

引用:

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);}
}
  • 接口中的默認方法

這意味著從版本8開始,java接口可以包含方法主體,因此簡單地說,java將支持多重繼承,而不會帶來通常的麻煩。 同樣,通過提供接口方法的默認實現,可以確保添加新方法不會在實現類中造成混亂。 JDK 8向java.util.Collection或java.util.Iterator之類的接口添加了默認方法,并通過此方法提供了一種在實際需要的地方更好地使用lambda的機制。

值得注意的接口添加:

java.util.stream.Streamablejava.util.stream.Stream

改善館藏的互動

在我看來,lambda項目所帶來的所有更改都是對語言的重大補充,這將使其與當前的標準保持一致,并使之更簡單,更精簡,但可能會對生產力產生最大的影響,并且最大的好處是+效果肯定是集合框架的改進。 不,沒有Collection 2框架,我們現在仍然需要處理類型擦除,但是Java將做出另一個重要的轉變:從外部迭代到內部迭代。 這樣,它為開發人員提供了一種以優雅的方式過濾和聚合集合的機制,此外還可以提高效率。 通過提供將在內部執行的lambda表達式,可以充分利用多核處理器的功能。 讓我們考慮以下情形:

一個。 考慮一個字符串列表,選擇所有大寫的字符串。 怎么寫?
舊方法:

//.....List inputList = new LinkedList<>();List upper = new LinkedList<>();// add elementsfor (String currentValue : inputList) {if (currentValue != null && currentValue.matches("[A-Z0-9]*")) {upper.add(currentValue);}}System.out.println(upper);

//….. 新方法:

//.....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。 以及如何從所選集合中找出字符數

// .....  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.Stream

d。 如果我想從集合中獲取每個元素并打印出來怎么辦?

//OLD WAY:
for (String current : list) {System.out.println(current);
}//NEW WAY:list.forEach(x -> System.out.println(x));

除了提到的功能之外,JDK 8還有其他有趣的消息,但是出于簡潔的原因,我將在這里停止。 有關它的更多信息,請參見JDK 8 Project lambda網站或JSR 337的網頁。

總而言之,Java正在向前發展,我個人喜歡它的發展方向,另一個興趣點是庫開發人員也開始采用JDK 8的時間點。 那肯定會很有趣。 謝謝您的時間和耐心,祝您圣誕快樂。

資源資源

Brian Goetz資源文件夾:
http://cr.openjdk.java.net/~briangoetz/lambda

方法/構造方法參考:
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博客上對JDK 8的遠見。

翻譯自: https://www.javacodegeeks.com/2012/12/java-far-sight-look-at-jdk-8.html

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

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

相關文章

CSS 學習路線(一)元素

元素(element) 類型:替換和非替換元素 替換元素(replaced element): 用來替換元素內容的部分并非由文檔內容直接顯示. eg:img input 非替換元素(nonreplaced element): 其內容由用戶代理在元素本身生成的框顯示. eg:絕大多數都是非替換元素 基本元素類型:塊級(block-lev…

[urllib]urlretrieve在python3

python3下面要使用&#xff1a;urllib.request.urlretrieve()這種形式的調用 1 from urllib.request import urlretrieve 2 3 4 urlretrieve(url, path) 轉載于:https://www.cnblogs.com/sigai/p/8178375.html

使用Gulp壓縮CSS/JS

一、安裝 1.安裝gulp npm install -g gulp2.檢查gulp 版本 gulp -v3.在項目文件夾下安裝gulp npm install --save-dev gulp二、壓縮JS 1.安裝gulp-uglify模塊 npm install gulp-uglify2.在項目根目錄創建gulpfile.js文件 3.在gulpfile.js文件中寫入代碼 // 獲取 gulpvar gulp …

android活動開始,android – 點擊谷歌地圖標記infoWindow開始活動

我建議使用HashMap或類似的東西.當您遍歷對象列表并為它們創建標記時,還要將標記添加到列表中,使用對象的ID作為鍵,將標記作為值&#xff1a;private HashMap markerMap new HashMap();…for(MarkerObject obj : this.markerObjects){//If the marker isnt already being disp…

Hamcrest包含匹配器

與Hamcrest 1.2相比 &#xff0c;針對Matchers類的Hamcrest 1.3 Javadoc文檔為該類的幾種方法添加了更多文檔。 例如&#xff0c;四個重載的contains方法具有更具描述性的Javadoc文檔&#xff0c;如下面所示的兩個比較屏幕快照所示。 盡管僅通過嘗試就可以弄清楚“包含”匹配器…

華為cor—al10_cor al10是華為什么型號 cor al10是華為啥型號

cor al10是華為榮耀Play。外觀方面&#xff0c;榮耀Play提供有星云紫&#xff0c;極光藍&#xff0c;幻夜黑三種基礎配色&#xff0c;以及幻夜黑與魅焰紅的酷玩版配色&#xff1b;拍照方面&#xff0c;榮耀Play具有1600萬AI雙攝像頭&#xff0c;前置攝像頭為1600萬像素&#xf…

函數 (四) 迭代器和生成器

一 迭代器 一 迭代的概念 #迭代器即迭代的工具&#xff0c;那什么是迭代呢&#xff1f;#迭代是一個重復的過程&#xff0c;每次重復即一次迭代&#xff0c;并且每次迭代的結果都是下一次迭代的初始值 while True: #只是單純地重復&#xff0c;因而不是迭代print(>) l[1,2,3]…

進階-JMS 知識梳理

JMS 一、 概述與介紹 ActiveMQ 是Apache出品&#xff0c;最流行的、功能強大的即時通訊和集成模式的開源服務器。ActiveMQ 是一個完全支持JMS1.1和J2EE 1.4規范的 JMS Provider實現。提供客戶端支持跨語言和協議&#xff0c;帶有易于在充分支持JMS 1.1和1.4使用J2EE企業集成模式…

android藍牙pair,Android向更多藍牙設備開放Fast Pair功能 配對更輕松了

原標題&#xff1a;Android向更多藍牙設備開放Fast Pair功能 配對更輕松了 來源&#xff1a;cnBeta.COM藍牙是一項應用非常廣泛的無線技術&#xff0c;在無線音頻配件、智能手表和智能家電中都廣泛使用。不過藍牙設備的配對體驗并不優秀&#xff0c;而且無法實現跨平臺的一致性…

用CSS讓DIV上下左右居中的方法

例如 一個父div(w:100%;h:400px)中有一個子div(w:100px;100px;)。讓其上下左右居中。 方法一&#xff08;varticle-align&#xff09; 理念 利用表格單元格的居中屬性。 步驟 父div外層配置一個div&#xff0c;同時設置為表格元素 (display: table)&#xff0c;寬度為100%父…

功能性Java集合

如今&#xff0c;在功能上大肆宣傳&#xff0c;因此至少在Java集合方面&#xff0c;我將簡要介紹一下其中的功能。 我個人喜歡標準 集合API&#xff0c;但在某些情況下可能會很尷尬并添加其他詳細信息。 在Java 8的更高版本中&#xff0c;這應該不是問題。 在那里&#xff0c;…

python繪制帕累托圖

python繪制帕累托圖代碼 1 import pandas as pd2 import matplotlib.pyplot as plt3 plt.rcParams[font.sans-serif][SimHei]#表示可以顯示中文4 plt.rcParams[axes.unicode_minus]False#表示可以正常顯示正負號5 datapd.read_csv(catering_dish_profit.csv,index_coltype)6 pr…

currentStyle、getComputedStyle 獲取樣式

style.height 獲取的是行間的樣式 currentStyle.height、getComputedStyle(elem,null).height 獲取的是 div 的 content 的寬高&#xff0c; clientHeight 獲取的是 contentpadding&#xff0c; offsetHeight 獲取的是contentpaddingborder。 <script> window.onload…

html5 測評游戲,暗黑之王評測:HTML5游戲鑄就最華麗ARPG冒險

由白鷺時代(Egret Technology)與比悅科技聯手推出的重度大型HTML5游戲《暗黑之王》&#xff0c;一款典型的ARPG手游&#xff0c;其HTML5版本推出以來&#xff0c;獲得了來自業界、玩家和媒體的大量關注。其豐富的游戲內容和玩法&#xff0c;加上卓越的游戲性能表現&#xff0c;…

搞定flex布局

這幾種方式的搭配使用可以輕松搞定 PC 端頁面的常見需求&#xff0c;比如實現水平居中可以使用 margin: 0 auto&#xff0c;實現水平垂直同時居中可以如下設置&#xff1a;.dad {position: relative; } .son {position: absolute;margin: auto;top: 0;right: 0;bottom: 0;left…

Java基礎5一數組的常見應用算法

常用算法 1.冒泡排序: 原理&#xff1a;比較兩個相鄰的元素&#xff0c;將值大的元素交換至右端 示例: public static void bubbleSort(int[] a) {int n a.length;//總共進行n-1輪的比較for (int i 1; i < n; i) {for (int j 0; j < n - i; j) {if (a[j] > a[j 1]…

使用Xtend構建Vaadin UI

今天&#xff0c;我決定向Xtend打個招呼。 我希望學習一些新的編程語言。 選擇一個標準的清單并不多。 它必須是在JVM上運行的編程語言&#xff0c; 如果我不需要學習用于建筑應用的全新生態系統&#xff0c;那就太好了。 我已經檢查了幾個選項。 JVM的編程語言列表已不多了…

python 瀏覽器顯示本地文件夾_瀏覽器讀取本地文件

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存儲NAS是一個可共享訪問&#xf…

p15頁

給你一個n*n的01矩陣&#xff0c;只能夠將0變成1&#xff0c;使得每個元素上下左右之和均是偶數&#xff0c; 比如 0 0 0 0 1 0 1 0 0>>>>1 0 1 0 0 0 0 1 0 一個轉變了3步 多實例T 然后一個n&#xff08;n<15&#xff09; 表示n*n的矩陣 …

html 登陸sql server,jsp實現注冊與登錄頁面+sqlsever2008

//index.jspString path request.getContextPath();String basePath request.getScheme()"://"request.getServerName()":"request.getServerPort()path"/";%>登陸用戶登陸用戶名&#xff1a;密 碼:注冊新用戶//Logon.jspString path req…