中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

jdk 1.8 optional的使用

發布時間:2020-07-02 13:35:40 來源:網絡 閱讀:162 作者:ckllf 欄目:編程語言

  前言

  在前面簡單介紹了stream 流的使用,這篇博客主要介紹optional類的使用。

  知道 Google 的 Guava 的同學,一定知道jdk的很多都是借鑒guava里面的思想來進行升級的,optional就是其中之一,早在java 6時,Guava 就提供了 Optional > 的實現。

  言歸正傳,開始干

  NullPointerException 是編碼過程中必須要處理的防御式檢查,我們可能用if(null != user) 或者 Objects.isNull(user)等方式處理,再jdk1.8之后,你可以優雅的處理這個問題

  定義

  Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。

  Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

  Optional 類的引入很好的解決空指針異常。

  方法實例演示

  例舉幾個常用的函數,然后進行實際使用分析

  of

  //創建一個值為張三的String類型的Optional

  Optional ofOptional = Optional.of("李四");

  //如果我們用of方法創建Optional對象時,所傳入的值為null,則拋出NullPointerException

  Optional nullOptional = Optional.of(null);

  of的用法實際上就是靜態工廠方法,示例如下:

  @Data

  public class Card {

  private String name;

  private String number;

  private Card() {}

  private Card(String name,String number) {

  this.name = name;

  this.number = number;

  }

  public static Card of() {

  return new Card();

  }

  public static Card of(String name,String number) {

  return new Card(name,number);

  }

  }

  目前,靜態工廠方法比較流行,如果目標類類不需要子類化,非常推薦使用這種方式。

  get

  如果創建的Optional對象中有值存在則返回此值,如果沒有值存在,則會拋出

  NoSuchElementException異常

  ofNullable

  //為指定的值創建Optional對象,不管所傳入的值為null不為null,創建的時候都不會報錯

  Optional nullOptional = Optional.ofNullable(null);

  Optional noNullOptional = Optional.ofNullable("李四");

  System.out.println(nullOptional.get());//拋出異常 NoSuchElementException: No value present

  System.out.println(noNullOptional.get());//李四

  empty

  //創建一個空的String類型的Optional對象

  Optional emptyOptional = Optional.empty();

  System.out.println(emptyOptional .get());//拋出異常 NoSuchElementException

  orElse

  存在就返回該值,不存在就返回默認值

  Optional stringOptional = Optional.of("張三");

  System.out.println(stringOptional.orElse("zhangsan"));//張三

  Optional emptyOptional = Optional.empty();

  System.out.println(emptyOptional.orElse("李四"));//李四

  orElseThrow

  如果創建的Optional中有值存在,則返回此值,否則拋出一個由指定的Supplier接口生成的異常

  Optional stringOptional = Optional.of("張三");

  System.out.println(stringOptional.orElseThrow(Exception::new));

  map鄭州婦科醫院 http://www.zykdfkyy.com/

  如果創建的Optional中的值存在,對該值執行提供的Function函數調用

  map方法執行傳入的lambda表達式參數對Optional實例的值進行修改,修改后的返回值仍然是一個Optional對象

  Optional stringOptional = Optional.of("張三");

  System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能為空"));

  stringOptional = Optional.empty();

  System.out.println(stringOptional.map(e -> e.toUpperCase()).orElse("不能為空"));

  filter

  如果創建的Optional中的值滿足filter中的條件,則返回包含該值的Optional對象,否則返回一個空的Optional對象

  Optional stringOptional = Optional.of("張三");

  System.out.println(stringOptional.filter(e -> e.equals("張三")));//Optional[張三]

  System.out.println(stringOptional.filter(e -> !e.equals("張三")).orElse("李四"));//張三

  stringOptional = Optional.empty();

  System.out.println(stringOptional.filter(e -> e.equals("張三")).orElse("李四"));//李四

  flagMap

  flatMap與map(Funtion)方法類似,區別在于flatMap中的mapper返回

  值必須是Optional,map方法的mapping函數返回值可以是任何類型T

  Optional stringOptional = Optional.of("張三");

  System.out.println(stringOptional.flatMap(e -> Optional.of("李四")).orElse("不能為空"));

  可能看到這兒之后并沒有感覺到多么好用,該寫的判斷還是要寫,咱們繼續

  實際使用

  Person p = new Person("李四",11);//如果 p = null 拋出"年齡不能為空"異常

  Integer orElseThrow = Optional.ofNullable(p)

  .map(s -> s.getAge())//返回參數為年齡的function

  .map(b ->b + 1)//返回參數為年齡+ 1 的function

  .filter(m -> m.compareTo(10) == 1)//如果年齡大于10則保留,小于10則過濾掉

  .orElseThrow(() -> new Exception("年齡不合法"));//如果為空則拋出該異常

  System.out.println(orElseThrow);//12

  這種用法可以對單條或多條(配合foreach)能簡化大量代碼和判斷,通過拋出統一異常,使用異常攔截器進行攔截,統一處理,能很大程度上提高開發效率和代碼閱讀性。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鹤庆县| 吉木乃县| 兴化市| 泰州市| 夹江县| 兰西县| 澎湖县| 缙云县| 平乡县| 兴和县| 吴旗县| 永定县| 肃北| 湖南省| 丰台区| 凤冈县| 饶河县| 永登县| 象州县| 尖扎县| 庆云县| 海丰县| 板桥市| 寿宁县| 重庆市| 济源市| 高尔夫| 南和县| 阜康市| 松江区| 芦溪县| 东乡县| 宁远县| 安溪县| 富裕县| 西贡区| 兴义市| 双城市| 九龙县| 兖州市| 广平县|