前言
看大佬推薦的書單買了一本《Java 8實戰(zhàn)》,總覺得在了解Java 8之前,是不是也應(yīng)該去了解了解一下Java 7的一些特性?所以就自己百度了一些資料來學(xué)習(xí)。
當(dāng)然還是要先看看官方文檔啦
這里是詳細介紹(缺點是全英文的,貌似還不是官方的,不過很詳細):https://www.oreilly.com/learning/java7-features
下面大部分內(nèi)容均來自這一篇文章,翻譯一下而已。
戳進去看看,大概還是能看懂的,看到有博客說Java 7大部分的特性都是語法糖。
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語句中使用:字符串類型。
說我們有一個根據(jù)其地位來處理貿(mào)易的要求。直到現(xiàn)在,我們使用if-其他語句來完成這個任務(wù)。
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類型作為參數(shù)。
public voidprocessTrade(Trade t) {
String status = t.getStatus();
switch(status) {
caseNEW:
newTrade(t);
break;
caseEXECUTE:
executeTrade(t);
break;
casePENDING:
pendingTrade(t);
break;
default:
break;
}
}
在上面的程序中,狀態(tài)字段總是通過使用 String.equals() 與案例標(biāo)簽來進行比較。
3.自動資源管理
Java中有一些資源需要手動關(guān)閉,例如Connections,F(xiàn)iles,Input/OutStreams等。通常我們使用 try-finally 來關(guān)閉資源:
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 voidnewTry() {
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語句中一個接一個地含在語句中,每一個都用分號(;)分隔符分隔開。我們不必手動取消或關(guān)閉流,因為當(dāng)空間存在try塊時,它們將自動關(guān)閉。
在后臺,應(yīng)該自動關(guān)閉的資源必須試驗 java.lang.AutoCloseable 接口。
任何實現(xiàn) AutoCloseable 接口的資源都可以作為自動資源管理的候選。AutoCloseable 是 java.io.Closeable 接口的父類,JVM會在程序退出try塊后調(diào)用一個方法 close()。
4.帶下劃線的數(shù)字文本
數(shù)字文字絕對是對眼睛的一種考驗。我相信,如果你給了一個數(shù)字,比如說,十個零,你就會像我一樣數(shù)零。如果不計算從右到左的位置,識別一個文字的話,就很容易出錯,而且很麻煩。Not anymore。Java在識別位置時引入了下劃線。例如,您可以聲明1000,如下所示:
int thousand = 1_000;
或1000000(一百萬)如下:
int million = 1_000_000
請注意,這個版本中也引入了二進制文字-例如“0b1”-因此開發(fā)人員不必再將它們轉(zhuǎn)換為十六進制。
5.改進的異常處理
在異常處理區(qū)域有幾處改進。Java引入了多個catch功能,以使用單個抓到塊捕獲多個異常類型。
假設(shè)您有一個方法,它拋出三個異常。在當(dāng)前狀態(tài)下,您將分別處理它們,如下所示:
public voidoldMultiCatch() {
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塊中逐個捕獲一個連續(xù)的異常,看起來很混亂。我還看到了捕獲十幾個異常的代碼。這是非常低效和容易出錯的。Java為解決這只丑小鴨帶來了新的語言變化。請參閱下面的方法oldMultiCatch方法的改進版本:
public voidnewMultiCatch() {
try{
methodThatThrowsThreeExceptions();
} catch(ExceptionOne | ExceptionTwo | ExceptionThree e) {
// log and deal with all Exceptions
}
}
多個異常通過使用 “|”操作符在一個catch塊中捕獲。這樣,您不必編寫數(shù)十個異常捕獲。但是,如果您有許多屬于不同類型的異常,那么您也可以使用“多個catch塊”塊。下面的代碼片段說明了這一點:
public voidnewMultiMultiCatch() {
try{
methodThatThrowsThreeExceptions();
} catch(ExceptionOne e) {
// log and deal with ExceptionOne
} catch(ExceptionTwo | ExceptionThree e) {
// log and deal with ExceptionTwo and ExceptionThree
}
}
在上面的例子中,在和ExceptionThree屬于不同的層次結(jié)構(gòu),因此您希望以不同的方式處理它們,但使用一個抓到塊。
6.New file system API(NIO 2.0)
那些使用Java的人可能還記得框架引起的頭痛。在操作系統(tǒng)或多文件系統(tǒng)之間無縫地工作從來都不是一件容易的事情.。有些方法,例如刪除或重命名,在大多數(shù)情況下都是出乎意料的。使用符號鏈接是另一個問題。實質(zhì)上API需要大修。
為了解決上述問題,Java引入了一個新的API,并在許多情況下引入了新的api。
在NIO2.0提出了許多增強功能。在處理多個文件系統(tǒng)時,它還引入了新的類來簡化開發(fā)人員的生活。
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
刪除文件或目錄就像在文件中調(diào)用delete方法(注意復(fù)數(shù))一樣簡單。在類公開兩個刪除方法,一個拋出NoSuchFileException,另一個不拋。
下面的delete方法調(diào)用拋出NoSuchFileException,因此您必須處理它:
Files.delete(path);
Where as Files.deleteIfExists(path) does not throw exception (as expected) if the file/directory does not exist.
使用 Files.deteleIfExists(path) 則不會拋出異常。
您可以使用其他實用程序方法,例如Files.copy(.)和Files.move(.)來有效地對文件系統(tǒng)執(zhí)行操作。類似地,使用 createSymbolicLink(..) 方法使用代碼創(chuàng)建符號鏈接。
文件更改通知
JDK 7中最好的改善算是File change notifications(文件更改通知)了。這是一個長期等待的特性,它最終被刻在NIO 2.0中。WatchService API 允許您在對主題(目錄或文件)進行更改時接收通知事件。
具體的創(chuàng)建步驟就不給了,總之它的功能就跟它的名字一般,當(dāng)文件發(fā)生更改的時候,能及時作出反饋。
7.Fork and Join(Fork/Join框架)
在一個java程序中有效地使用并行內(nèi)核一直是一個挑戰(zhàn)。很少有國內(nèi)開發(fā)的框架將工作分配到多個核心,然后加入它們來返回結(jié)果集。Java已經(jīng)將這個特性作為Fork/Join框架結(jié)合了起來。
基本上,在把手頭的任務(wù)變成了小任務(wù),直到小任務(wù)簡單到可以不進一步分手的情況下解決。這就像一個分而治之的算法.。在這個框架中需要注意的一個重要概念是,理想情況下,沒有工作線程是空閑的。他們實現(xiàn)了一個 work-stealing 算法,在空閑的工人“偷”工作從那些工人誰是忙。
支持Fork-Join機制的核心類是ForkJoinPool和ForkJoinTask。
這里是Java 7的新特性一覽表:http://www.oschina.net/news/20119/new-features-of-java-7
歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明出處!
簡書ID:@我沒有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號:wmyskxz
分享自己的學(xué)習(xí) & 學(xué)習(xí)資料 & 生活
想要交流的朋友也可以加qq群:3382693