Java7 新特性
文章目錄
- 正文
- 1. Diamond Operator
- 2. 在switch語句中使用字符串
- 3. 自動資源管理
- 4. 帶下劃線的數字文本
- 5. 改進的異常處理
- 6. New file system API(NIO 2.0)
- Working With Path(使用路徑)
- 文件更改通知
- 7. Fork and Join(Fork/Join框架)
正文
1. Diamond Operator
類型判斷是一個人特殊的煩惱,入下面的代碼:
Map<String,List<String>> anagrams = new HashMap<String,List<String>>();通過類型推斷后變成:
Map<String,List<String>> anagrams = new HashMap<>();注:這個<>被叫做diamond(鉆石)運算符,Java 7后這個運算符從引用的聲明中推斷類型。
2. 在switch語句中使用字符串
switch語句可以使用原始類型或枚舉類型。Java引入了另一種類型,我們可以在switch語句中使用:字符串類型。
說我們有一個根據其地位來處理貿易的要求。直到現在,我們使用if-其他語句來完成這個任務。
private voidprocessTrade(Trade t){String status = t.getStatus();if(status.equalsIgnoreCase(NEW)) {newTrade(t);} else if(status.equalsIgnoreCase(EXECUTE)) {executeTrade(t);} else if(status.equalsIgnoreCase(PENDING)) {pendingTrade(t);} }這種處理字符串的方法是粗糙的。在Java中,我們可以使用增強的switch語句來改進程序,該語句以String類型作為參數。
public voidprocessTrade(Trade t) {String status = t.getStatus();switch(status) {case NEW:newTrade(t);break;case EXECUTE:executeTrade(t);break;case PENDING:pendingTrade(t);break;default:break;} }在上面的程序中,狀態字段總是通過使用 String.equals() 與案例標簽來進行比較。
3. 自動資源管理
Java中有一些資源需要手動關閉,例如Connections,Files,Input/OutStreams等。通常我們使用 try-finally 來關閉資源:
public voidoldTry() {try{fos= newFileOutputStream("movies.txt");dos= newDataOutputStream(fos);dos.writeUTF("Java 7 Block Buster");} catch(IOException e) {e.printStackTrace();} finally{try{fos.close();dos.close();} catch(IOException e) {// log the exception}} }然而,在Java 7中引入了另一個很酷的特性,可以自動管理資源。它的操作也很簡單,我們所要做的就是在 try 塊中申明資源如下:
try(resources_to_be_cleant){// your code }以上方法與舊的 try-finally 能最終寫成下面的代碼:
public void newTry() {try (FileOutputStream fos = newFileOutputStream("movies.txt");DataOutputStream dos = newDataOutputStream(fos)) {dos.writeUTF("Java 7 Block Buster");} catch(IOException e) {// log the exception} }上面的代碼也代表了這個特性的另一個方面:處理多個資源。FileOutputStream 和 DataOutputStream 在try語句中一個接一個地含在語句中,每一個都用分號(;)分隔符分隔開。
我們不必手動取消或關閉流,因為當空間存在try塊時,它們將自動關閉。
在后臺,應該自動關閉的資源必須實現 java.lang.AutoCloseable 接口。
任何實現 AutoCloseable 接口的資源都可以作為自動資源管理的候選。AutoCloseable 是 java.io.Closeable 接口的父類,JVM會在程序退出try塊后調用一個方法 close()。
4. 帶下劃線的數字文本
數字文字絕對是對眼睛的一種考驗。我相信,如果你給了一個數字,比如說,十個零,你就會像我一樣數零。如果不計算從右到左的位置,識別一個文字的話,就很容易出錯,而且很麻煩。Not anymore。Java在識別位置時引入了下劃線。例如,您可以聲明1000,如下所示:
int thousand = 1_000;或1000000(一百萬)如下:
int million = 1_000_000請注意,這個版本中也引入了二進制文字-例如“0b1”-因此開發人員不必再將它們轉換為十六進制。
5. 改進的異常處理
在異常處理區域有幾處改進。Java引入了多個catch功能,以使用單個抓到塊捕獲多個異常類型。
假設您有一個方法,它拋出三個異常。在當前狀態下,您將分別處理它們,如下所示:
public void oldMultiCatch() {try{methodThatThrowsThreeExceptions();} catch(ExceptionOne e) {// log and deal with ExceptionOne} catch(ExceptionTwo e) {// log and deal with ExceptionTwo} catch(ExceptionThree e) {// log and deal with ExceptionThree} }在一個catch塊中逐個捕獲一個連續的異常,看起來很混亂。我還看到了捕獲十幾個異常的代碼。這是非常低效和容易出錯的。Java為解決這只丑小鴨帶來了新的語言變化。請參閱下面的方法oldMultiCatch方法的改進版本:
public void newMultiCatch() {try{methodThatThrowsThreeExceptions();} catch(ExceptionOne | ExceptionTwo | ExceptionThree e) {// log and deal with all Exceptions} }多個異常通過使用 “|”操作符在一個catch塊中捕獲。這樣,您不必編寫數十個異常捕獲。但是,如果您有許多屬于不同類型的異常,那么您也可以使用“多個catch塊”塊。下面的代碼片段說明了這一點:
public void newMultiMultiCatch() {try{methodThatThrowsThreeExceptions();} catch(ExceptionOne e) {// log and deal with ExceptionOne} catch(ExceptionTwo | ExceptionThree e) {// log and deal with ExceptionTwo and ExceptionThree} }在上面的例子中,在和ExceptionThree屬于不同的層次結構,因此您希望以不同的方式處理它們,但使用一個catch塊。
6. New file system API(NIO 2.0)
那些使用Java的人可能還記得框架引起的頭痛。在操作系統或多文件系統之間無縫地工作從來都不是一件容易的事情.。有些方法,例如刪除或重命名,在大多數情況下都是出乎意料的。使用符號鏈接是另一個問題。實質上API需要大修。
為了解決上述問題,Java引入了一個新的API,并在許多情況下引入了新的api。
在NIO2.0提出了許多增強功能。在處理多個文件系統時,它還引入了新的類來簡化開發人員的生活。
Working With Path(使用路徑)
新的 java.nio.file 由包和接口組成例如:Path,Paths,FileSystem,FileSystems等等。
路徑只是對文件路徑的簡單引用。它與java.io.File等價(并具有更多的特性)。下面的代碼段顯示了如何獲取對“臨時”文件夾的路徑引用:
public voidpathInfo() {Path path= Paths.get("c:\Temp\temp");System.out.println("Number of Nodes:"+ path.getNameCount());System.out.println("File Name:"+ path.getFileName());System.out.println("File Root:"+ path.getRoot());System.out.println("File Parent:"+ path.getParent()); }最終控制臺的輸出將是:
Number of Nodes:2 File Name:temp.txt File Root:c: File Parent:c:Temp刪除文件或目錄就像在文件中調用delete方法(注意復數)一樣簡單。在類公開兩個刪除方法,一個拋出NoSuchFileException,另一個不拋。
下面的delete方法調用拋出NoSuchFileException,因此您必須處理它:
Files.delete(path);使用 Files.deteleIfExists(path) 則不會拋出異常。
您可以使用其他實用程序方法,例如Files.copy(.)和Files.move(.)來有效地對文件系統執行操作。類似地,使用 createSymbolicLink(…) 方法使用代碼創建符號鏈接。
文件更改通知
JDK 7中最好的改善算是File change notifications(文件更改通知)了。這是一個長期等待的特性,它最終被刻在NIO 2.0中。WatchServiceAPI 允許您在對主題(目錄或文件)進行更改時接收通知事件。
具體的創建步驟就不給了,總之它的功能就跟它的名字一般,當文件發生更改的時候,能及時作出反饋。
7. Fork and Join(Fork/Join框架)
在一個java程序中有效地使用并行內核一直是一個挑戰。很少有國內開發的框架將工作分配到多個核心,然后加入它們來返回結果集。Java已經將這個特性作為Fork/Join框架結合了起來。
基本上,在把手頭的任務變成了小任務,直到小任務簡單到可以不進一步分手的情況下解決。這就像一個分而治之的算法.。在這個框架中需要注意的一個重要概念是,理想情況下,沒有工作線程是空閑的。他們實現了一個 work-stealing 算法,在空閑的工人“偷”工作從那些工人誰是忙。
支持Fork-Join機制的核心類是ForkJoinPool和ForkJoinTask。
總結
- 上一篇: 【已解决不重装】windows10自动修
- 下一篇: Java是世界上最好的语言?会是未来第一