Java8編程新思想速覽

u=1933633967,2722140240&fm=15&gp=0.jpg

Java為什么還在變化卸察?

Java從出生到現(xiàn)在已經(jīng)有近30年的時間了既忆,為什么它還需要不斷的變化呢?首先Java也不是盡善盡美的邑雅,畢竟每種語言都只是在整個編程的生態(tài)系統(tǒng)中占據(jù)某個位置而已片橡,此外硬件條件、程序的規(guī)模淮野、數(shù)據(jù)的量級等等都是逐漸變化的捧书。Java語言也需要去主動擁抱這些變化,綜合起來可以把Java為什么還在變化的原因總結為一下三點:

  • 我們在之前的Java版本中要充分利用現(xiàn)代CPU多核心的優(yōu)勢骤星,就需要編寫多線程代碼经瓷,而多線程代碼不僅編寫復雜還容易出錯;
  • 函數(shù)式比命令式更適應新的體系架構洞难;
    • 什么是函數(shù)式編程:函數(shù)式編程指的是使用這種方式編寫的代碼舆吮,它的語體是表達式形式的,主要是用來計算的表達式(不是編程語言中的Function/Method的概念)
    • 什么是命令式編程:命令式編程指的是使用這種方式編寫的代碼,它的語體是面向?qū)ο缶幊讨谐R?guī)的語句形式歪泳;
    • 為什么需要函數(shù)式編程:后面會細說
  • 相比其他語言萝勤,實現(xiàn)相同功能的代碼量一直是Java被人詬病的地方;

Java8引入的核心思想

Java8作為自Java5以來變化最大的一個版本呐伞,它引入的核心思想主要就是為了把計算從面向?qū)ο蟮捏w系里獨立出來敌卓。隨著現(xiàn)在的業(yè)務邏輯越來越復雜,單純面向?qū)ο蟮木幊谭绞皆谔幚眍l繁多變的計算類業(yè)務邏輯時伶氢,顯得越來越笨拙趟径。而一些函數(shù)式編程語言在這方面卻大獲成功,這給與了Java的設計者相當大的生存壓力癣防。面向?qū)ο笏枷氲膹姶笾幵谟谖锨桑芎茏匀坏膶φ鎸嵤澜缫粋€個實體的屬性和行為進行抽象。而計算更多的是發(fā)生在對象之間蕾盯,它像是一個沒有固定形態(tài)的工具幕屹。所以把函數(shù)式編程思想引入到Java中來,作為面向?qū)ο笏枷氲囊粋€補充是很有必要的级遭。

Java8中引入函數(shù)式編程思想的方式非常的巧妙望拖,可以總結為一下兩點:

  • 將方法和Lambda作為一等公民——像基本數(shù)據(jù)類型和對象引用一樣的能在程序運行時傳遞;
  • 在沒有可變共享狀態(tài)時挫鸽,函數(shù)或方法可以有效说敏、安全地并行執(zhí)行——通過流API在底層進行實現(xiàn);

Java8帶來了哪些新特性丢郊?

以下新特性部分先寫個知識點的大綱盔沫,后續(xù)再分章節(jié)逐一細說。

Stream API

Streams是Java8的核心內(nèi)容枫匾,另外的兩項特性(方法引用/Lambda架诞、接口默認函數(shù))主要就是用來實現(xiàn)Streams(流處理);

為什么需要流干茉?

  • 現(xiàn)有的對集合的處理代碼谴忧,顯得很繁瑣(嵌套的循環(huán)、條件判斷等)等脂;
  • 不能利用多核俏蛮;

StreamAPI的設計思想

  • 讓集合保留他存儲和訪問數(shù)據(jù)的功能,而使用Stream來對數(shù)據(jù)進行計算上遥;

向方法中傳遞代碼

Java語言中的一等公民

  • 編程語言的整個目的就在于操作值搏屑,在Java8之前,這個值包括基本數(shù)據(jù)類型和對象的引用粉楚;
  • 在Java中還有方法和類辣恋,在執(zhí)行期間是不能被傳遞的亮垫,所以是二等公民;
  • Java 8中新增了函數(shù)——值的一種新形式伟骨;

在JavaScript中饮潦,類也是可以傳遞的。

Scala和Groovy等語言的實踐已經(jīng)證明携狭,讓方法等概念作為一等值可以擴充程序員的工具庫继蜡,
從而讓編程變得更容易。

方法引用的寫法

Java8之前的寫法

File[] files = new File(path).listFiles(new FileFilter() {
    @Override
    public boolean accept(File pathname) {
        return pathname.isHidden();
    }
});

Java8中的寫法

File[] files = new File(path).listFiles(File::isHidden);

最大的好處是:我們的代碼現(xiàn)在讀起來更接近問題的陳述了逛腿。

匿名函數(shù)-Lambda

  • 除了允許(命名)函數(shù)成為一等值外稀并,Java 8還體現(xiàn)了更廣義的將函數(shù)作為值的思想,包括Lambda(匿名函數(shù))单默。

  • 對于已有的方法碘举,可以很方便的使用方法引用的寫法,但是如果是一段即時代碼(比如一個計算公式)搁廓,直接用匿名函數(shù)的形式傳入方法中引颈,會更簡潔。否則需要定義一個類境蜕、一個方法蝙场,把這個計算公式放到方法中。

    new File(path).listFiles(file -> file.isHidden());
    

    listFiles()方法中需要的參數(shù)是一個FileFilter汽摹,為什么可以傳入一個Lambda表達式

接口中的默認方法

為什么要在接口中增加默認方法李丰?

  • Java的設計者發(fā)現(xiàn)JDK中的接口也需要修改苦锨,但如果直接修改接口的話逼泣,意味著接口的實現(xiàn)者都需要跟著修改,這是毀滅性的災難舟舒。所以設計了接口的默認方法拉庶,所有的實現(xiàn)類都可以使用這些默認接口,而不需要修改自身秃励。

Optional

為了更好的解決和避免NPE異常氏仗,Java 8中引入了一個新的類java.util.Optional。

這是一個封裝Optional值的類夺鲜。

舉例來說皆尔,使用新的類意味著,如果你知道一個人可能有也可能沒有車币励,那么Person類內(nèi)部的car變量就不應該聲明為Car慷蠕,遭遇某人沒有車時把null引用賦值給它,而是將其聲明為Optional類型食呻。

變量存在時流炕,Optional類只是對類簡單封裝澎现。變量不存在時,缺失的值會被建模成一個“空”的Optional對象每辟,由方法Optional.empty()返回剑辫。Optional.empty()方法是一個靜態(tài)工廠方法,它返回Optional類的特定單一實例渠欺。

null引用和Optional.empty()有什么本質(zhì)的區(qū)別嗎妹蔽?

使用Optional而不是null的一個非常重要而又實際的語義區(qū)別是,第一個例子中挠将,我們在聲明變量時使用的是Optional類型讹开,而不是Car類型,這句聲明非常清楚地表明了這里發(fā)生變量缺失是允許的捐名。與此相反旦万,使用Car這樣的類型,可能將變量賦值為null镶蹋,這意味著你需要獨立面對這些成艘,你只能依賴你對業(yè)務模型的理解,判斷一個null是否屬于該變量的有效范疇贺归。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末淆两,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拂酣,更是在濱河造成了極大的恐慌秋冰,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婶熬,死亡現(xiàn)場離奇詭異剑勾,居然都是意外死亡,警方通過查閱死者的電腦和手機赵颅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門虽另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饺谬,你說我怎么就攤上這事捂刺。” “怎么了募寨?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵族展,是天一觀的道長。 經(jīng)常有香客問我拔鹰,道長仪缸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任格郁,我火速辦了婚禮腹殿,結果婚禮上独悴,老公的妹妹穿的比我還像新娘。我一直安慰自己锣尉,他們只是感情好刻炒,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著自沧,像睡著了一般坟奥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拇厢,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天爱谁,我揣著相機與錄音,去河邊找鬼孝偎。 笑死访敌,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的衣盾。 我是一名探鬼主播寺旺,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼势决!你這毒婦竟也來了阻塑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤果复,失蹤者是張志新(化名)和其女友劉穎陈莽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體虽抄,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡走搁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了极颓。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱盐。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡群嗤,死狀恐怖菠隆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狂秘,我是刑警寧澤骇径,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站者春,受9級特大地震影響破衔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜钱烟,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一晰筛、第九天 我趴在偏房一處隱蔽的房頂上張望嫡丙。 院中可真熱鬧,春花似錦读第、人聲如沸曙博。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽父泳。三九已至,卻和暖如春吴汪,著一層夾襖步出監(jiān)牢的瞬間惠窄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工漾橙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留杆融,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓霜运,卻偏偏與公主長得像擒贸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子觉渴,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

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

  • Java8 in action 沒有共享的可變數(shù)據(jù)介劫,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說的函數(shù)式...
    鐵牛很鐵閱讀 1,213評論 1 2
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本。Java 8 為Java語言案淋、編譯器座韵、類庫、開發(fā)...
    huoyl0410閱讀 616評論 1 2
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本踢京。Java 8 為Java語言誉碴、編譯器、類庫瓣距、開發(fā)...
    誰在烽煙彼岸閱讀 887評論 0 4
  • 前言:Java 8 已經(jīng)發(fā)布很久了黔帕,很多報道表明Java 8 是一次重大的版本升級。在Java Code Geek...
    糖寶_閱讀 1,321評論 1 1
  • 歡迎交流java8新特性系列文章:http://www.reibang.com/nb/27231419 . [...
    DoubleBin閱讀 12,052評論 0 51