Java8新特性

自從使用上了Java8的Lambda和Stream編程后,徹底的愛(ài)上了症歇。因此決定研究下其他新特性郎笆。

Lambda表達(dá)式

什么是lambda表達(dá)式谭梗?lambda表達(dá)式就是一個(gè)匿名函數(shù),是一段可以傳遞的代碼题画。表達(dá)式表達(dá)式默辨,你可以理解為就是一堆表達(dá)式以函數(shù)形式封裝在一起,只不過(guò)沒(méi)有函數(shù)名苍息。這堆表達(dá)式可以被一個(gè)引用持有缩幸,傳遞這個(gè)引用就是傳遞這個(gè)匿名函數(shù)。

但是我們知道竞思,Java中所有的東西都是類或者接口表谊,那lambda應(yīng)該屬于類還是接口呢?答案就是lambda屬于函數(shù)式接口盖喷,就是只有一個(gè)方法的接口爆办。只有接口只有一個(gè)方法,那么他就可以用lambda來(lái)表示课梳,比如Runnable距辆、Callable、Comparator接口暮刃。Java8還新增了幾個(gè)通用的函數(shù)式接口:Function跨算、Comsumer、Supplier椭懊、Predicate诸蚕。

  • Function:函數(shù)型接口,輸入一個(gè)入?yún)⒀踱敵鲆粋€(gè)出參
  • Consumer接口:消費(fèi)型接口背犯,輸入一個(gè)入?yún)ⅲ瑹o(wú)返回值盅抚,形象的理解就是把參數(shù)吃(消費(fèi))了
  • Supplier:供給型接口漠魏,無(wú)入?yún)ⅲ祷匾粋€(gè)值妄均。形象理解就是你不用給我提供什么東西蛉幸,我供給你一些東西。
  • Predicate:斷言型接口丛晦,接收一個(gè)參數(shù)奕纫,返回一個(gè)boolean值。

lambda表達(dá)式的作用有:

  • 簡(jiǎn)化部分匿名內(nèi)部類的寫法:為什么是部分呢烫沙?因?yàn)閘ambda只能簡(jiǎn)化接口只有函數(shù)式接口的匿名內(nèi)部類匹层。函數(shù)式接口只有一個(gè)未實(shí)現(xiàn)的函數(shù),你使用lambda匿名函數(shù)就是實(shí)現(xiàn)該接口。如果匿名內(nèi)部類有多個(gè)未實(shí)現(xiàn)的方法升筏,當(dāng)然就不能使用lambda表達(dá)式類取代了撑柔。

綜上,lambda就是一個(gè)函數(shù)式接口您访,可以自己寫一個(gè)函數(shù)式接口來(lái)接收l(shuí)ambda铅忿,或者使用Java提供的通用的接口Function、Consumer灵汪、Supplier檀训、Predicate接口。

函數(shù)式接口

就是只有一個(gè)方法的接口享言,可以使用@FunctionInterface注解加到接口上峻凫,約束該接口不能超過(guò)兩個(gè)方法。當(dāng)然不加該注解也可以览露。

方法引用與構(gòu)造器引用

其實(shí)就是lambda的更進(jìn)一步的簡(jiǎn)寫荧琼。

方法引用:和lambda類似,寫lambda表達(dá)式時(shí)需要你手動(dòng)寫一堆表達(dá)式差牛,如果這堆表達(dá)式其實(shí)某個(gè)方法已經(jīng)實(shí)現(xiàn)了命锄,則不需要再寫lambda了,只需要傳入方法引用即可偏化。主要有三種表達(dá)方式:

  • 對(duì)象::實(shí)例方法名
  • 類::靜態(tài)方法名
  • 類::實(shí)例方法名:上面都是把參數(shù)對(duì)應(yīng)到參數(shù)列表脐恩,這種方式則不是,本來(lái)方法參數(shù)需要和參數(shù)列表對(duì)應(yīng)夹孔,但如果方法的第一個(gè)參數(shù)是該參數(shù)實(shí)例,則可以用這種方法析孽。比如搭伤,你如果想寫 (a) -> a.getName(); 則完全可以寫為A::getName

例如你要寫一個(gè)大于String的lambda,一般是:

Consumer<String> c = x -> System.out.println(x);

你可以發(fā)現(xiàn)袜瞬,這個(gè)打印的動(dòng)作是你手動(dòng)寫表達(dá)式做的怜俐,即System.out.println(x),其實(shí)打印的動(dòng)作System.out這個(gè)實(shí)例的println已經(jīng)實(shí)現(xiàn)了邓尤,那么可以使用方法引用如下:

Consumer<String> c = System.out::println;

構(gòu)造器引用拍鲤,類名::new。用來(lái)生成一個(gè)對(duì)象汞扎。如果一個(gè)類有多個(gè)構(gòu)造器季稳,則new選用哪個(gè)構(gòu)造器取決于方法入?yún)ⅰ?/p>

如果要調(diào)用無(wú)參構(gòu)造器,則用供給型接口:

Supplier<Employee> s = Employee::new;

如果要調(diào)用單個(gè)參數(shù)的構(gòu)造器澈魄,則使用函數(shù)型接口:

Function<Integer, Employee> f = Employee::new;

由上可知景鼠,一個(gè)引用可以對(duì)應(yīng)到不同的重載方法,具體使用的是哪個(gè)方法痹扇,要看你接收的函數(shù)型接口的參數(shù)铛漓。

Stream API

流式操作溯香,Stream不會(huì)改變?cè)醇希ㄟ^(guò)Stream操作后會(huì)生成流浓恶。標(biāo)準(zhǔn)的Stream操作是:

  • 通過(guò)集合創(chuàng)建Stream流玫坛,一般是.stream()方法
  • 做操作
  • 終止操作,生成新集合

Optional類

自我感覺(jué)不好用包晰,不做介紹湿镀,這是用來(lái)避免空指針的,我覺(jué)得還不如用Spring的Assert來(lái)斷言比較好

接口中的默認(rèn)方法與靜態(tài)方法

Java8后杜窄,接口中可以有已經(jīng)實(shí)現(xiàn)的默認(rèn)方法肠骆。接口中也可以有靜態(tài)實(shí)現(xiàn)的方法。

新時(shí)間日期API

Java8以前的日期Date不易使用塞耕,同時(shí)日期格式化類SimpleDateFormatter存在線程安全問(wèn)題蚀腿。Java8新出的幾個(gè)日期類型則非常的易用

  • LocalDate:日期類型
  • LocalTime:時(shí)間類型
  • LocalDateTime:日期時(shí)間類型
  • Instant:時(shí)間戳,of方法是從1970-01-01開始算起
  • Duration:計(jì)算兩個(gè)時(shí)間之間的間隔扫外,Duration.between(LocalTime, LocalTime)
  • Period:計(jì)算兩個(gè)日期之間的間隔莉钙,Period.between(LocalDate, LocalDate)
  • TemporalAdjuster:時(shí)間校正器,如筛谚,獲取下一個(gè)周六磁玉,LocalDateTime.now().with(TemporalAdjusters.next(DayOfWeek.SATURDAY))
  • DateTimeFormatter:時(shí)間日期格式化
  • ZoneId:時(shí)區(qū)轉(zhuǎn)化
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市驾讲,隨后出現(xiàn)的幾起案子蚊伞,更是在濱河造成了極大的恐慌,老刑警劉巖吮铭,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件时迫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡谓晌,警方通過(guò)查閱死者的電腦和手機(jī)掠拳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)纸肉,“玉大人溺欧,你說(shuō)我怎么就攤上這事“胤荆” “怎么了姐刁?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)烦味。 經(jīng)常有香客問(wèn)我龙填,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任岩遗,我火速辦了婚禮扇商,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘宿礁。我一直安慰自己案铺,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布梆靖。 她就那樣靜靜地躺著控汉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪返吻。 梳的紋絲不亂的頭發(fā)上姑子,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音测僵,去河邊找鬼街佑。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捍靠,可吹牛的內(nèi)容都是我干的沐旨。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼榨婆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼磁携!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起良风,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤谊迄,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后烟央,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體统诺,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年吊档,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篙议。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唾糯。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡怠硼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出移怯,到底是詐尸還是另有隱情香璃,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布舟误,位于F島的核電站葡秒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜眯牧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一蹋岩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧学少,春花似錦剪个、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至绒疗,卻和暖如春侵歇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吓蘑。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工惕虑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人士修。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓枷遂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親棋嘲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子酒唉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345