Optional 常用方法總結

2022-09-30 06:00:37

轉載請註明出處:

  Optional 類是 JAVA 8 提供的判斷程式是否為空提供的包裝工具類;可以減少程式碼中的 是否為空的判斷,以及減少 NullPointerExceptions;使得程式變得更為健壯;有助於建立簡單、可讀性更強、比對應程式錯誤更少的程式。

Optional 常用的方法總結:

  • empty : 建立一個空的Optional物件

  • of:為非null的值建立一個Optional。of方法通過工廠方法建立Optional類。需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲NullPointerException。因此不經常用。

  • ofNullable:為指定的值建立一個Optional,如果指定的值為null,則返回一個空的Optional。

  • isPresent: 檢查一個Optional物件中是否有值,只有值非空才返回truex,否則返回false。

  • ifPresent:如果Optional範例有值則為其呼叫consumer,否則不做處理

  • get:如果Optional有值則將其返回,否則丟擲NoSuchElementException。因此也不經常用。

  • orElse:如果有值則將其返回,否則返回指定的其它值。經常用於判斷返回預設值的場景;

  • orElseGet:orElseGet與orElse方法類似,區別在於得到的預設值。orElse方法將傳入的字串作為預設值,orElseGet方法可以接受Supplier介面的實現用來生成預設值

  • orElseThrow:如果有值則將其返回,否則丟擲supplier介面建立的異常。

  • filter: 接收一個函數式介面 ,如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。

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

  • flatMap:如果有值,為其執行mapping函數返回Optional型別返回值,否則返回空Optional。

 

通過範例檢視 optional 帶來的好處 

  範例一

    根據使用者的物件獲取使用者的名稱,如果存在則返回使用者名稱稱,沒有則返回 unknown ;沒有使用 Option 的 Java 實現程式碼如下:

  public static String getName2(User user){
        if (user!=null){
            String name = user.getName();
            if (StringUtils.isBlank(name)){
                return "unKnown";
            }
            return name;
        }
        return "unKnown";
    }

    沒有使用Optional 時,需要不斷的判斷是否為空,增加了程式碼的可讀性和維護性,使用 Optional 之後,程式碼如下:

  public static String getName(User user){
        return  Optional.ofNullable(user).map(p->p.getName()).orElse("unKnown");
    }

    使用Optional 之後,通過一行便完成了 上述的功能,減少了層層的 if 判斷

  範例 二

    從一批學生中,選出年齡大於等於18,參加過考試並且成績大於80的人去參加比賽。

public void useJava8() {
    List<Student> studentList = initData();
    for (Student student : studentList) {
        Optional<Student> studentOptional = Optional.of(student);
        Integer score = studentOptional.filter(s -> s.getAge() >= 18).map(Student::getScore).orElse(0);
 
        if (score > 80) {
            System.out.println("入選:" + student.getName());
        }
    }
}