前言
看大佬推薦的書單買了一本《Java 8實(shí)戰(zhàn)》攒盈,總覺得在了解Java 8之前,是不是也應(yīng)該去了解了解一下Java 7的一些特性八堡?所以就自己百度了一些資料來(lái)學(xué)習(xí)桥温。
當(dāng)然還是要先看看官方文檔啦
這里是詳細(xì)介紹(缺點(diǎn)是全英文的扑浸,貌似還不是官方的烧给,不過(guò)很詳細(xì)):https://www.oreilly.com/learning/java7-features
下面大部分內(nèi)容均來(lái)自這一篇文章,翻譯一下而已首装。
戳進(jìn)去看看创夜,大概還是能看懂的,看到有博客說(shuō)Java 7大部分的特性都是語(yǔ)法糖仙逻。
1.Diamond Operator
類型判斷是一個(gè)人特殊的煩惱驰吓,入下面的代碼:
Map<String,List<String>> anagrams = new HashMap<String,List<String>>();
通過(guò)類型推斷后變成:
Map<String,List<String>> anagrams = new HashMap<>();
注:這個(gè)<>被叫做diamond(鉆石)運(yùn)算符涧尿,Java 7后這個(gè)運(yùn)算符從引用的聲明中推斷類型。
2.在switch語(yǔ)句中使用字符串
switch語(yǔ)句可以使用原始類型或枚舉類型檬贰。Java引入了另一種類型姑廉,我們可以在switch語(yǔ)句中使用:字符串類型。
說(shuō)我們有一個(gè)根據(jù)其地位來(lái)處理貿(mào)易的要求翁涤。直到現(xiàn)在桥言,我們使用if-其他語(yǔ)句來(lái)完成這個(gè)任務(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中号阿,我們可以使用增強(qiáng)的switch語(yǔ)句來(lái)改進(jìn)程序,該語(yǔ)句以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)字段總是通過(guò)使用 String.equals() 與案例標(biāo)簽來(lái)進(jìn)行比較。
3.自動(dòng)資源管理
Java中有一些資源需要手動(dòng)關(guān)閉届谈,例如Connections枯夜,F(xiàn)iles,Input/OutStreams等艰山。通常我們使用 try-finally 來(lái)關(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中引入了另一個(gè)很酷的特性,可以自動(dòng)管理資源曙搬。它的操作也很簡(jiǎn)單摔吏,我們所要做的就是在 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
}
}
上面的代碼也代表了這個(gè)特性的另一個(gè)方面:處理多個(gè)資源。FileOutputStream 和 DataOutputStream 在try語(yǔ)句中一個(gè)接一個(gè)地含在語(yǔ)句中纵装,每一個(gè)都用分號(hào)(;)分隔符分隔開舔腾。我們不必手動(dòng)取消或關(guān)閉流,因?yàn)楫?dāng)空間存在try塊時(shí)搂擦,它們將自動(dòng)關(guān)閉。
在后臺(tái)哗脖,應(yīng)該自動(dòng)關(guān)閉的資源必須試驗(yàn) java.lang.AutoCloseable 接口瀑踢。
任何實(shí)現(xiàn) AutoCloseable 接口的資源都可以作為自動(dòng)資源管理的候選。AutoCloseable 是 java.io.Closeable 接口的父類才避,JVM會(huì)在程序退出try塊后調(diào)用一個(gè)方法 close()橱夭。
4.帶下劃線的數(shù)字文本
數(shù)字文字絕對(duì)是對(duì)眼睛的一種考驗(yàn)。我相信桑逝,如果你給了一個(gè)數(shù)字棘劣,比如說(shuō),十個(gè)零楞遏,你就會(huì)像我一樣數(shù)零茬暇。如果不計(jì)算從右到左的位置首昔,識(shí)別一個(gè)文字的話,就很容易出錯(cuò)糙俗,而且很麻煩勒奇。Not anymore。Java在識(shí)別位置時(shí)引入了下劃線巧骚。例如赊颠,您可以聲明1000,如下所示:
int thousand = 1_000;
或1000000(一百萬(wàn))如下:
int million = 1_000_000
請(qǐng)注意劈彪,這個(gè)版本中也引入了二進(jìn)制文字-例如“0b1”-因此開發(fā)人員不必再將它們轉(zhuǎn)換為十六進(jìn)制竣蹦。
5.改進(jìn)的異常處理
在異常處理區(qū)域有幾處改進(jìn)。Java引入了多個(gè)catch功能沧奴,以使用單個(gè)抓到塊捕獲多個(gè)異常類型痘括。
假設(shè)您有一個(gè)方法,它拋出三個(gè)異常扼仲。在當(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
}
}
在一個(gè)catch塊中逐個(gè)捕獲一個(gè)連續(xù)的異常屠凶,看起來(lái)很混亂驰后。我還看到了捕獲十幾個(gè)異常的代碼。這是非常低效和容易出錯(cuò)的矗愧。Java為解決這只丑小鴨帶來(lái)了新的語(yǔ)言變化灶芝。請(qǐng)參閱下面的方法oldMultiCatch方法的改進(jìn)版本:
public voidnewMultiCatch() {
try{
methodThatThrowsThreeExceptions();
} catch(ExceptionOne | ExceptionTwo | ExceptionThree e) {
// log and deal with all Exceptions
}
}
多個(gè)異常通過(guò)使用 “|”操作符在一個(gè)catch塊中捕獲。這樣唉韭,您不必編寫數(shù)十個(gè)異常捕獲夜涕。但是,如果您有許多屬于不同類型的異常属愤,那么您也可以使用“多個(gè)catch塊”塊女器。下面的代碼片段說(shuō)明了這一點(diǎn):
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)住诸,因此您希望以不同的方式處理它們驾胆,但使用一個(gè)抓到塊。
6.New file system API(NIO 2.0)
那些使用Java的人可能還記得框架引起的頭痛贱呐。在操作系統(tǒng)或多文件系統(tǒng)之間無(wú)縫地工作從來(lái)都不是一件容易的事情.丧诺。有些方法,例如刪除或重命名奄薇,在大多數(shù)情況下都是出乎意料的驳阎。使用符號(hào)鏈接是另一個(gè)問(wèn)題。實(shí)質(zhì)上API需要大修。
為了解決上述問(wèn)題呵晚,Java引入了一個(gè)新的API蜘腌,并在許多情況下引入了新的api。
在NIO2.0提出了許多增強(qiáng)功能劣纲。在處理多個(gè)文件系統(tǒng)時(shí)逢捺,它還引入了新的類來(lái)簡(jiǎn)化開發(fā)人員的生活。
Working With Path(使用路徑)
新的 java.nio.file 由包和接口組成例如:Path,Paths,FileSystem,FileSystems等等癞季。
路徑只是對(duì)文件路徑的簡(jiǎn)單引用劫瞳。它與java.io.File等價(jià)(并具有更多的特性)。下面的代碼段顯示了如何獲取對(duì)“臨時(shí)”文件夾的路徑引用:
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());
}
最終控制臺(tái)的輸出將是:
Number of Nodes:2
File Name:temp.txt
File Root:c:
File Parent:c:Temp
刪除文件或目錄就像在文件中調(diào)用delete方法(注意復(fù)數(shù))一樣簡(jiǎn)單绷柒。在類公開兩個(gè)刪除方法志于,一個(gè)拋出NoSuchFileException,另一個(gè)不拋废睦。
下面的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) 則不會(huì)拋出異常。
您可以使用其他實(shí)用程序方法嗜湃,例如Files.copy(.)和Files.move(.)來(lái)有效地對(duì)文件系統(tǒng)執(zhí)行操作奈应。類似地,使用 createSymbolicLink(..) 方法使用代碼創(chuàng)建符號(hào)鏈接购披。
文件更改通知
JDK 7中最好的改善算是File change notifications(文件更改通知)了杖挣。這是一個(gè)長(zhǎng)期等待的特性,它最終被刻在NIO 2.0中刚陡。WatchService API 允許您在對(duì)主題(目錄或文件)進(jìn)行更改時(shí)接收通知事件惩妇。
具體的創(chuàng)建步驟就不給了,總之它的功能就跟它的名字一般筐乳,當(dāng)文件發(fā)生更改的時(shí)候歌殃,能及時(shí)作出反饋。
7.Fork and Join(Fork/Join框架)
在一個(gè)java程序中有效地使用并行內(nèi)核一直是一個(gè)挑戰(zhàn)蝙云。很少有國(guó)內(nèi)開發(fā)的框架將工作分配到多個(gè)核心氓皱,然后加入它們來(lái)返回結(jié)果集。Java已經(jīng)將這個(gè)特性作為Fork/Join框架結(jié)合了起來(lái)勃刨。
基本上匀泊,在把手頭的任務(wù)變成了小任務(wù),直到小任務(wù)簡(jiǎn)單到可以不進(jìn)一步分手的情況下解決朵你。這就像一個(gè)分而治之的算法.。在這個(gè)框架中需要注意的一個(gè)重要概念是揣非,理想情況下抡医,沒(méi)有工作線程是空閑的。他們實(shí)現(xiàn)了一個(gè) work-stealing 算法,在空閑的工人“偷”工作從那些工人誰(shuí)是忙忌傻。
支持Fork-Join機(jī)制的核心類是ForkJoinPool和ForkJoinTask大脉。
這里是Java 7的新特性一覽表:http://www.oschina.net/news/20119/new-features-of-java-7
歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明出處水孩!
簡(jiǎn)書ID:@我沒(méi)有三顆心臟
github:wmyskxz
歡迎關(guān)注公眾微信號(hào):wmyskxz
分享自己的學(xué)習(xí) & 學(xué)習(xí)資料 & 生活
想要交流的朋友也可以加qq群:3382693