1. 程式人生 > 其它 >使用JDK8的新特性-Optional來避免Java空指標異常

使用JDK8的新特性-Optional來避免Java空指標異常

什麼是Optional

領域模型概念可參考:淺談領域模型



使用Optional

package com.github.ybqdren;

import java.util.Optional;

/**
 * Wen(Joan) Zhao <[email protected]>
 * 2021/11/6
 */

@SuppressWarnings("all")
public class OptionalUsage {

    public static class User{
        private String name;

        public String getName(){
            return name;
        }
    }

    private static User anoymos(){
        return new User();
    }

    public static void main(String[] args) {

    }
}


不推薦這樣使用Optional

private static void isUserEqualNull(){
    Optional<User> optional = Optional.empty();

    if(optional.isPresent()){  // 是否為空,為空返回false  不為空返回true
        System.out.println("User is not null");
    }else{
        System.out.println("User is null");
    }
}

因為上面這種判空的方法與下面這種直接判斷是否是NULL幾乎一樣:

    // 常見的一種判空方法
    private static void isUserEqualNull_2(){
        User user = null;

        if(user != null){
            System.out.println("User is not null");
        }else{
            System.out.println("User is null");
        }
    }

所以,這樣使用新的API意義不大。


使用optional提供的API來判定物件是否為NULL

User user = null;

.ofNullable() 如果為空就返回一個空的Optoinal例項 如果不為空就返回User的示例

Optional<User> optionalUser = Optional.ofNullable(user);

orElse() 存在即返回傳入的物件,空則提供預設值

optionalUser.orElse(new User());

orElseGet() 存在即返回,空則由函式區產生 此方法複用性更強

optionalUser.orElseGet(() -> anoymos());

orElseThrow() 存在即返回,否則丟擲異常

optionalUser.orElseThrow(RuntimeException::new);

ifPresent() 存在才去做相應的處理

optionalUser.ifPresent(u -> System.out.println(u.getName()));

map() 對Optional中的物件執行某種操作,且會返回一個Optional物件

optionalUser.map(u -> u.getName()).orElse("anymos");

執行流程分析:

  1. map 獲取optionalUser的name屬性 獲取到之後被map方法封裝為一個optional物件。
  2. 獲取到的optional物件是一個string型別 這個string型別的optional有可能也是空。
  3. 對這個物件使用orElse()方法進行判定,如果為空就返回預設值"anymos"。

map是可以無限級聯的

optionalUser.map(u->u.getName()).map(name->name.length()).orElse(0);

應該注意的地方

Optional中的get ifPresent這樣的方法更應該看作是私有的方法,因此不要直接去使用。



參考引用

Java實操避坑指南



上一篇文章 哪些情況會導致操作字串 陣列和集合時出現Java空指標

本文來自部落格園,作者:趙雯_後端開發工程師,轉載請註明原文連結:https://www.cnblogs.com/ybqdren/p/15518485.html