摘要:它的出現(xiàn)是為我們解決空指針異常的,以前我們寫代碼如果不進(jìn)行判斷,會(huì)經(jīng)常出現(xiàn)異常。因?yàn)樗旧砭褪莻€(gè)對(duì)象,不管放進(jìn)去的對(duì)象為不為,始終不會(huì)返回,所以你也不需要在你的業(yè)務(wù)流程中進(jìn)行一大堆的判斷,避免了程序運(yùn)行時(shí)的空指針異常。
想必大家已經(jīng)在使用jdk1.8做項(xiàng)目開(kāi)發(fā),但是你對(duì)于它里面的一些性特性了解多少呢?有沒(méi)有在你的項(xiàng)目中運(yùn)用呢?現(xiàn)在就和我來(lái)一起梳理一下吧。介紹
它是java.util包下的一個(gè)類,是一個(gè)包裹對(duì)象的容器,它可以包裹null或非null的對(duì)象。如果你要獲取容器中的對(duì)象,需要使用get()方法。它的出現(xiàn)是為我們解決空指針異常的,以前我們寫代碼如果不進(jìn)行if判斷,會(huì)經(jīng)常出現(xiàn)異常?,F(xiàn)在有了他就會(huì)很優(yōu)雅。因?yàn)樗旧砭褪莻€(gè)對(duì)象,不管放進(jìn)去的對(duì)象為不為null,始終不會(huì)返回null,所以你也不需要在你的業(yè)務(wù)流程中進(jìn)行一大堆的判斷,避免了程序運(yùn)行時(shí)的空指針異常。
實(shí)例化OptionalOptional.of()
不允許包裹為null的對(duì)象,否則程序報(bào)錯(cuò)。
package com.example.demo.jdk; import java.util.Optional; /** * The class OptionalStudy */ public class OptionalStudy { public static void main(String[] args) throws Exception { Optional op = Optional.of(null); //此處會(huì)報(bào)錯(cuò) System.out.println(op); } }
Optional.ofNullable()
允許包裹對(duì)象為nul,為null時(shí)返回empty Optional
public class OptionalStudy { public static void main(String[] args) throws Exception { Optional op = Optional.ofNullable(null); System.out.println(op); } }
注意:當(dāng)使用get()獲取容器中的對(duì)象時(shí),如果對(duì)象為null,會(huì)有java.util.NoSuchElementException異常。所以最好先進(jìn)行isPresent()判斷,如果返回true,說(shuō)明存在,然后再獲取。
主要方法調(diào)用 1.empty()返回empty的Optional實(shí)例,用的較少
2.equals(Object obj)判斷兩個(gè)Optional是否相等,主要是所包裹的對(duì)象是否相等
public class OptionalStudy { public static void main(String[] args) throws Exception { Optional op1 = Optional.of("hell"); Optional op2 = Optional.ofNullable("hello"); System.out.println(op1.equals(op2)); } }
輸出false,如果op1 也為hello則輸出true
3.filter(Predicate super T> predicate)如果值存在并且滿足斷言,則返回滿足條件的Optional,否則返回empty。經(jīng)常用來(lái)做過(guò)濾。
public class OptionalStudy { public static void main(String[] args) throws Exception { Optionalop = Optional.of("jack"); Optional res = op.filter((name)-> name.length()>6); System.out.println(res); } }
輸出empty
4.map(Function super T,? extends U> mapper)如果值存在則對(duì)其進(jìn)行mapping函數(shù)操作,如果mappping結(jié)果不為空則返回Optional,否則返回empty。
public class OptionalStudy { public static void main(String[] args) throws Exception { Optionalop = Optional.of("jack"); Optional res = op.map((name) -> "hello,"+name); System.out.println(res); } }
輸出hello,jack
5.flatMap(Function super T,Optional> mapper)功能類似map,只不過(guò)需要在mapping函數(shù)中,自己封裝成Optional。
public class OptionalStudy { public static void main(String[] args) throws Exception { Optional6. orElse(T other)op = Optional.of("jack"); Optional res = op.flatMap((name) -> Optional.ofNullable("hello,"+name)); System.out.println(res); } }
值存在則返回,否則返回其它值。相當(dāng)于給默認(rèn)值。
public class OptionalStudy { public static void main(String[] args) throws Exception { Optionalop = Optional.ofNullable(null); System.out.println(op.orElse("other")); } }
輸出other。
7. orElseGet(Supplier extends T> other)功能類似orElse都是返回值,不同在于它能使用lambda表達(dá)式更靈活的處理返回默認(rèn)值
public class OptionalStudy { public static void main(String[] args) throws Exception { Optionalop = Optional.ofNullable(null); System.out.println(op.orElseGet(() -> String.valueOf(true))); } }
輸出 true
8. ifPresent(Consumer super T> consumer)如果值存在,則執(zhí)行l(wèi)ambda表達(dá)式,否則不做任何處理。注意它沒(méi)有返回值。
public class OptionalStudy { public static void main(String[] args) throws Exception { Optionalop = Optional.ofNullable(null); op.ifPresent((v)->{System.out.println(v);}); } }
沒(méi)有任何輸出,因?yàn)橹挡淮嬖凇?/p> 總結(jié)
以上就是所有能夠用到的方法,可以在你的項(xiàng)目中去使用。對(duì)所有方法的參數(shù)使用optional進(jìn)行包裹,避免空指針。更多學(xué)習(xí)總結(jié),請(qǐng)關(guān)注我的公眾號(hào)mike啥都想搞,更有精品學(xué)習(xí)資料相送。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/77451.html
摘要:雖然目前工作環(huán)境仍然以為主,不過(guò)目前已是大勢(shì)所趨了。標(biāo)準(zhǔn)函數(shù)式接口新的包定義旨在使用的廣泛函數(shù)式接口。這一改進(jìn)使得擁有了類似于多繼承的能力。 從Java8發(fā)布到現(xiàn)在有好幾年了,而Java9也提上發(fā)布日程了(沒(méi)記錯(cuò)的話好像就是這個(gè)月2017年7月,也許會(huì)再度跳票吧,不過(guò)沒(méi)關(guān)系,穩(wěn)定大于一切,穩(wěn)定了再發(fā)布也行),現(xiàn)在才開(kāi)始去真正學(xué)習(xí),說(shuō)來(lái)也是慚愧。雖然目前工作環(huán)境仍然以Java6為主,不過(guò)...
摘要:會(huì)在數(shù)據(jù)源內(nèi)部隱式的遍歷進(jìn)行處理。會(huì)并行遍歷數(shù)據(jù),將數(shù)據(jù)分成若干段,同時(shí)進(jìn)行處理,最終匯總結(jié)果一起輸出。結(jié)束操作會(huì)觸發(fā)實(shí)際計(jì)算,計(jì)算發(fā)生時(shí)會(huì)把所有中間操作積攢的操作以的方式執(zhí)行,這樣可以減少迭代次數(shù)。為函數(shù)式編程而生。 Stream實(shí)現(xiàn)了對(duì)數(shù)據(jù)源的流式處理,它可以并行操作,提高數(shù)據(jù)處理效率。 什么是流 流不是集合,它不對(duì)數(shù)據(jù)做保存,只是最數(shù)據(jù)進(jìn)行算法處理,比如最大值,最小值,排序等操作...
摘要:引言最近發(fā)現(xiàn)很多的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說(shuō)到還加了蠻多的特性,像一些的一些效果,動(dòng)畫屬性等。 引言 最近發(fā)現(xiàn)很多css3的新特性不熟悉,所以今天把它們都學(xué)習(xí)一邊,做出效果加深印象,說(shuō)到css3還加了蠻多的特性,像一些border的一些效果,動(dòng)畫屬性animation trasiform等。 1.border-radius(邊框圓角) 效果 showI...
摘要:基礎(chǔ)語(yǔ)法變量提升都可以個(gè)難點(diǎn)在編譯時(shí)執(zhí)行并沒(méi)有報(bào)錯(cuò),執(zhí)行結(jié)果如圖注意結(jié)果沒(méi)有變更改結(jié)果值變了參考新特性未完一直更新 基礎(chǔ)語(yǔ)法 變量提升 //es5 var arr = []; for(var i=0; i
摘要:運(yùn)行機(jī)制分為源,中間操作,終止操作。反過(guò)來(lái)說(shuō),目前還無(wú)法專為某個(gè)并行流指定這個(gè)值。我們?cè)诒竟?jié)中已經(jīng)指出,并行流不總是比順序流快。特別是和等依賴于元素順序的操作,它們?cè)诓⑿辛魃蠄?zhí)行的代價(jià)非常大。1 Stream Stream是一組用來(lái)處理數(shù)組,集合的API。 1.1 特性 不是數(shù)據(jù)結(jié)構(gòu),沒(méi)有內(nèi)部存儲(chǔ)。 不支持索引訪問(wèn)。 延遲計(jì)算 支持并行 很容易生成數(shù)據(jù)或集合 支持過(guò)濾,查找,轉(zhuǎn)換,匯總,...
閱讀 3571·2021-11-25 09:43
閱讀 2459·2021-09-06 15:02
閱讀 3632·2021-08-18 10:21
閱讀 3444·2019-08-30 15:55
閱讀 2435·2019-08-29 17:06
閱讀 3609·2019-08-29 16:59
閱讀 1047·2019-08-29 13:47
閱讀 2924·2019-08-26 13:24