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

溫馨提示×

溫馨提示×

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

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

如何在Java8中使用Optional判空

發布時間:2021-05-10 17:05:38 來源:億速云 閱讀:332 作者:Leah 欄目:開發技術

本篇文章給大家分享的是有關如何在Java8中使用Optional判空,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

一、導語

在沒有用Optional判空之前,你是否也像下面的代碼一樣判空呢?如果是,請往下看,Optional 相對傳統判空的優勢。

如何在Java8中使用Optional判空

傳統階層判空

為什么要用Optional,它到底是什么東西

你也看到了上面的那張圖,一旦代碼量大起來了,條件多了,代碼就會變得很冗余,變得難以維護。那么此時我們就有必要了解Optional了。

Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會返回true,調用get()方法會返回該對象。Optional 是個容器:它可以保存類型T的值,或者僅僅保存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。Optional 類的引入很好的解決空指針異常。

二、Optional使用

Optional 的方法,如下圖

如何在Java8中使用Optional判空

Optional方法-圖1

如何在Java8中使用Optional判空

Optional方法-圖2

方法就是這么多,其他的也不必多說,相信各位小伙伴一看就懂;如何使用,還是用代碼演示,請往下移步。

三、Optional實例

1.of

為非null的值創建一個Optional。of方法通過工廠方法創建Optional類。需要注意的是,創建對象時傳入的參數不能為null。如果傳入參數為null,則拋出NullPointerException 。

Optional<String> optional = Optional.of("xiaoming");
//傳入null,拋出NullPointerException
Optional<Object> o = Optional.of(null);

2.ofNullable

為指定的值創建一個Optional,如果指定的值為null,則返回一個空的Optional。

Optional<Object> o1 = Optional.ofNullable(null);

3.isPresent

值存在返回true,否則返回false

Optional<String> optiona2 = Optional.of("xiaoming");
System.out.println(optiona2.isPresent());

4.get

Optional有值就返回,沒有拋出NoSuchElementException

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.get());

5.ifPresent

如果Optional有值則調用consumer處理,否則不處理

Optional<Object> o1 = Optional.ofNullable(null);
 o1.ifPresent(s -> System.out.println(s));

6.orElse

如果有值則將其返回,否則返回指定的其它值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElse("輸出orElse")); // 輸出orElse

7.orElseGet

orElseGet與orElse方法類似,區別在于得到的默認值。orElse方法將傳入的字符串作為默認值,orElseGet方法可以接受Supplier接口的實現用來生成默認值

Optional<Object> o1 = Optional.ofNullable(null);
System.out.println(o1.orElseGet(() -> "default value")); // default value

*注意:orElse 和 orElseGet 看似差不多,其實有很大不同;看下面例子

Shop shop = null;
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//createNew
private static Shop createNew() {  System.out.println("create new");
  return new Shop("尺子", 50);
}//輸出:
test orElsecreate newtest orElseGetcreate new
Shop shop = new Shop("鋼筆",100);
System.out.println("test orElse");
Optional.ofNullable(shop).orElse(createNew());System.out.println("test orElseGet");
Optional.ofNullable(shop).orElseGet(()->createNew());
//輸出
test orElsecreate newtest orElseGet

從上面兩個例子可以看到,當Optional 為空時,orElse和orElseGet 區別不大,但當Optional有值時,orElse仍然會去調用方法創建對象,而orElseGet不會再調用方法;在我們處理的業務數據量大的時候,這兩者的性能就有很大的差異。

8.orElseThrow

如果有值則將其返回,否則拋出supplier接口創建的異常。

Optional<Object> o1 = Optional.ofNullable(null);
try {
  o1.orElseThrow(() -> new Exception("異常!"));
} catch (Exception e) {
  System.out.println("info:" + e.getMessage());
}//輸出:info:異常!

9.map

如果有值,則對其執行調用mapping函數得到返回值。如果返回值不為null,則創建包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。

Optional<String> optional = Optional.of("xiaoming");
String s = optional.map(e -> e.toUpperCase()).orElse("shiyilingfeng");
System.out.println(s); //輸出: XIAOMING

10.flatMap

如果有值,為其執行mapping函數返回Optional類型返回值,否則返回空Optional。與map不同的是,flatMap 的返回值必須是Optional,而map的返回值可以是任意的類型T

Optional<String> optional = Optional.of("xiaoming");
Optional<String> s = optional.flatMap(e -> Optional.of(e.toUpperCase()));
System.out.println(s.get()); //輸出:XIAOMING

11.filter

List<String> strings = Arrays.asList("rmb", "doller", "ou");
for (String s : strings) {
  Optional<String> o = Optional.of(s).filter(s1 -> !s1.contains("o"));
  System.out.println(o.orElse("沒有不包含o的"));
}//輸出:
rmb
沒有不包含o的
沒有不包含o的

以上就是如何在Java8中使用Optional判空,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。

向AI問一下細節

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

AI

惠水县| 措勤县| 乌鲁木齐县| 城步| 翼城县| 凤山市| 兴仁县| 太康县| 巴林右旗| 乃东县| 黄浦区| 镇雄县| 南澳县| 东乌珠穆沁旗| 五原县| 利津县| 聂拉木县| 大连市| 婺源县| 商丘市| 犍为县| 南宁市| 银川市| 青铜峡市| 元朗区| 枣强县| 沧源| 西盟| 成都市| 龙海市| 新建县| 调兵山市| 霍林郭勒市| 新绛县| 宁波市| 家居| 哈密市| 焦作市| 星座| 临海市| 盈江县|