Java 7的新特性

前言

看大佬推薦的書單買了一本《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è)資源。FileOutputStreamDataOutputStream 在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)資源管理的候選。AutoCloseablejava.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镰矿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子俘种,更是在濱河造成了極大的恐慌秤标,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙刘,死亡現(xiàn)場(chǎng)離奇詭異苍姜,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)悬包,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門衙猪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人布近,你說(shuō)我怎么就攤上這事垫释。” “怎么了撑瞧?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棵譬,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我季蚂,道長(zhǎng)茫船,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任扭屁,我火速辦了婚禮算谈,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘料滥。我一直安慰自己然眼,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布葵腹。 她就那樣靜靜地躺著高每,像睡著了一般。 火紅的嫁衣襯著肌膚如雪践宴。 梳的紋絲不亂的頭發(fā)上鲸匿,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音阻肩,去河邊找鬼带欢。 笑死运授,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的乔煞。 我是一名探鬼主播吁朦,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼渡贾!你這毒婦竟也來(lái)了逗宜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤空骚,失蹤者是張志新(化名)和其女友劉穎纺讲,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體府怯,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡刻诊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了牺丙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片则涯。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖冲簿,靈堂內(nèi)的尸體忽然破棺而出粟判,到底是詐尸還是另有隱情,我是刑警寧澤峦剔,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布档礁,位于F島的核電站,受9級(jí)特大地震影響吝沫,放射性物質(zhì)發(fā)生泄漏呻澜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一惨险、第九天 我趴在偏房一處隱蔽的房頂上張望羹幸。 院中可真熱鬧,春花似錦辫愉、人聲如沸栅受。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屏镊。三九已至,卻和暖如春痰腮,著一層夾襖步出監(jiān)牢的瞬間而芥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工膀值, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棍丐,地道東北人弟翘。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像骄酗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悦冀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法趋翻,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法盒蟆,繼承相關(guān)的語(yǔ)法踏烙,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,641評(píng)論 18 399
  • 八历等、深入理解java異常處理機(jī)制 引子try…catch…finally恐怕是大家再熟悉不過(guò)的語(yǔ)句了讨惩, 你的答案是...
    壹點(diǎn)零閱讀 1,567評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評(píng)論 25 707
  • 既然改變不了別人就從改變自己做起!堅(jiān)持鍛煉身體寒屯,永遠(yuǎn)保持平和心態(tài)荐捻,臨危不亂,榮辱不驚寡夹!永遠(yuǎn)保持年輕心態(tài)处面!不瞻前顧后...
    sonia_dfc8閱讀 603評(píng)論 0 1
  • 我們小的時(shí)候,只是在元旦時(shí)會(huì)互送禮物菩掏,也僅僅是一張賀卡而已魂角。起初賀卡還沒(méi)有發(fā)展為顏色多樣款式新穎,只是最簡(jiǎn)單的一張...
    常星慧閱讀 1,107評(píng)論 0 0