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