java8的optional

Option類型

Optional<T>是一個T對象的封裝相速,比直接指向對象的引用更安全碟渺,正確的使用情況下不會返回Null


使用optional值

optional的值存在

  1. Optional的關鍵,在于 接受正確值或者返回替代值的方法- ifPresent() 方法

  2. 如果需要返回值突诬,可以使用 optionalObject.map( function對象 ) 苫拍,類似于Stream的map方法,此處可以將Optional 可選值類旺隙,當做一個大小為 0 或者1 的流绒极,返回的結果也是同樣的 0 或者1 的流。

Optional<String> a=Optional.of("有值");
//無返回值 一個接受String 的consumer的lambda表達式,當a有值時才執(zhí)行
a.ifPresent(s-> System.out.println(s));
//有返回值 接受一個function的函數 返回一個對應類型的Optional對象
Optional<Integer> result=a.map(String::length);

optional的值不存在

  1. optionalObject.orElse() 為空時返回一個自定義值

  2. optionalObject.orElseGet( Function ) 為空時執(zhí)行一個自定義函數蔬捷,并且返回自定義值

  3. optionalObject.orElseThrow() 接受一個返回異常的 Supplier

//2垄提、optional沒有值的處理,有值時正常返回正常值
Optional<String> emptyOptional = Optional.empty();
//為空就返回默認值
System.out.println(emptyOptional.orElse("為空時的默認值"));
//為空進行特殊處理,并自定義返回值
System.out.println(emptyOptional.orElseGet(()->{
    System.out.println("值為空啊,我返回空串了");
    return "";}));
//為空時拋異常
emptyOptional.orElseThrow(()->new NullPointerException("值為空啊 塔淤,我不管了 我要拋異常摘昌!"));

創(chuàng)建optional值

通過Optional 提供的靜態(tài)方法創(chuàng)建

  1. Optional.empty() 創(chuàng)建一個空的Optional

  2. Optional.of(obj) 從一個對象創(chuàng)建出一個對應的Optional對象速妖,obj如果為空則會拋出空指針異常

  3. Optional.ofNullable() 介于1和2之間高蜂,相當于 Optional a=a==null?Optional.empty():Optional.of(obj)


使用flatMap組合可選值函數

理解:flatmap和map都接受function作為參數,返回一個function結果罕容,如果function已經返回Optional<String> 那么Map返回 Optional<Optional<String>>备恤,但是flatMap會返回Optional<String>。這樣對于多個返回Optional的方法锦秒,可以鏈接組合返回類型為Optional的方法露泊。

static Optional<Integer> f(String a ){
    return Optional.of(555);
}
 //4、flatMap 組合可選值函數
Optional<String> optional =Optional.of("666");
//接受 Function<? super T, Optional<U>> 旅择,返回的參數必須是Optional,flatMap不會對其進行二次包裝
Optional<Integer> nn=optional.flatMap(OptionTest::f);
//Function<? super T, ? extends U> ,不管返回的參數是啥惭笑,都會包裝一層Optional
Optional<Optional<Integer>> mm= optional.map(OptionTest::f);

對比map和flatMap

  1. map和flatMap都接收一個mapping function參數。

  2. map和flatMap返回的都是Optional類型的數據生真。

  3. 當mapping function返回的是Optional類型的數據時沉噩,可以直接使用flatMap,flatMap直接返回該Optional柱蟀。

  4. 當mapping function返回的不是Optional類型的數據時川蒙,使用map,因為map會進行一次Optional的包裝长已。


Optional在哪兒用

  1. Optional *****不是***** Serializable畜眨。因此,它不應該用作類的字段术瓮。

  2. 如果需要序列化的對象包含 Optional 值康聂,Jackson支持把 *Optional 當作普通對象。也就是說胞四,Jackson *會把空對象看作 null恬汁,而有值的對象則把其值看作對應域的值。這個功能在 jackson-modules-java8 項目中

  3. 它在另一種情況下也并不怎么有用撬讽,就是在將其類型用作方法或構建方法的參數時蕊连。這樣做會讓代碼變得復雜,完全沒有必要:User user = new User("john@gmail.com", "1234", Optional.empty());

  4. *Optional *****主要用作返回類型游昼。在獲取到這個類型的實例后甘苍,如果它有值,你可以取得這個值烘豌,否則可以進行一些替代行為载庭。

  5. Optional 類有一個非常有用的用例,就是將其與流或其它返回* Optional* 的方法結合,以構建流暢的API囚聚。

@Test
public void whenEmptyStream_thenReturnDefaultOptional() {
    List<User> users = new ArrayList<>();
    User user = users.stream().findFirst().orElse(new User("default", "1234"));
    assertEquals(user.getEmail(), "default");
}
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末靖榕,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子顽铸,更是在濱河造成了極大的恐慌茁计,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谓松,死亡現場離奇詭異星压,居然都是意外死亡,警方通過查閱死者的電腦和手機鬼譬,發(fā)現死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門娜膘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人优质,你說我怎么就攤上這事竣贪。” “怎么了巩螃?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵演怎,是天一觀的道長。 經常有香客問我牺六,道長颤枪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任淑际,我火速辦了婚禮畏纲,結果婚禮上,老公的妹妹穿的比我還像新娘春缕。我一直安慰自己盗胀,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布锄贼。 她就那樣靜靜地躺著票灰,像睡著了一般。 火紅的嫁衣襯著肌膚如雪宅荤。 梳的紋絲不亂的頭發(fā)上屑迂,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音冯键,去河邊找鬼惹盼。 笑死,一個胖子當著我的面吹牛惫确,可吹牛的內容都是我干的手报。 我是一名探鬼主播蚯舱,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼掩蛤!你這毒婦竟也來了枉昏?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤揍鸟,失蹤者是張志新(化名)和其女友劉穎兄裂,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體蜈亩,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡懦窘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了稚配。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡港华,死狀恐怖道川,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情立宜,我是刑警寧澤冒萄,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站橙数,受9級特大地震影響尊流,放射性物質發(fā)生泄漏。R本人自食惡果不足惜灯帮,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一崖技、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钟哥,春花似錦迎献、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至播演,卻和暖如春冀瓦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背写烤。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工翼闽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人顶霞。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓肄程,卻偏偏與公主長得像锣吼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蓝厌,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容

  • 關于java8 Optional 文檔版本:v1.0版本 和C/C++不一樣玄叠,java從一開始就嘗試將指針徹底的包...
    比軒閱讀 3,749評論 1 22
  • 一、原因: 為避免nullPointException錯誤拓提,一般都是進行顯示的读恃!=null判斷,對于一些代碼嵌套比...
    我的軒轅閱讀 384評論 0 0
  • 為大家分享一篇介紹java8新特性的文章. 身為一名Java程序員代态,大家可能都有這樣的經歷:調用一個方法得到了返回...
    H_Man閱讀 2,588評論 0 5
  • NullPointerException——空指針異常是程序中常見異常之一蹦疑,也是導致程序運行失敗的常見異常西雀。以前,...
    程序員Mark_Chou閱讀 358評論 0 0
  • 避免用null來表示變量的缺失! 帶來的問題: java.util.Optional<T> 在對象模型中使用Opt...
    巴巴11閱讀 236評論 0 0