1. 程式人生 > >java8新特性---Optional類

java8新特性---Optional類

轉自:https://blog.csdn.net/hwsdau/article/details/78791328

我們首先要判斷這個返回值是否為null,只有在非空的前提下才能將其作為其他方法的引數

Optional類是一個可以為null的容器物件。探求一下它的方法。

1、of  為非null的值建立一個Optional

     of方法通過工廠方法建立Optional類。需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲  NullPointerException 。
 

 

public class OptionalDemo {
 
  public static void main(String[] args) {
    //建立Optional例項,也可以通過方法返回值得到。
    Optional<String> name = Optional.of("Sanaulla");
 
    //建立沒有值的Optional例項,例如值為'null'
    Optional empty = Optional.ofNullable(null);
 
    //isPresent方法用來檢查Optional例項是否有值。
    if (name.isPresent()) {
      //呼叫get()返回Optional值。
      System.out.println(name.get());
    }
 
    try {
      //在Optional例項上呼叫get()丟擲NoSuchElementException。
      System.out.println(empty.get());
    } catch (NoSuchElementException ex) {
      System.out.println(ex.getMessage());
    }
 
    //ifPresent方法接受lambda表示式引數。
    //如果Optional值不為空,lambda表示式會處理並在其上執行操作。
    name.ifPresent((value) -> {
      System.out.println("The length of the value is: " + value.length());
    });
 
    //如果有值orElse方法會返回Optional例項,否則返回傳入的錯誤資訊。
    System.out.println(empty.orElse("There is no value present!"));
    System.out.println(name.orElse("There is some value!"));
 
    //orElseGet與orElse類似,區別在於傳入的預設值。
    //orElseGet接受lambda表示式生成預設值。
    System.out.println(empty.orElseGet(() -> "Default Value"));
    System.out.println(name.orElseGet(() -> "Default Value"));
 
    try {
      //orElseThrow與orElse方法類似,區別在於返回值。
      //orElseThrow丟擲由傳入的lambda表示式/方法生成異常。
      empty.orElseThrow(ValueAbsentException::new);
    } catch (Throwable ex) {
      System.out.println(ex.getMessage());
    }
 
    //map方法通過傳入的lambda表示式修改Optonal例項預設值。 
    //lambda表示式返回值會包裝為Optional例項。
    Optional<String> upperName = name.map((value) -> value.toUpperCase());
    System.out.println(upperName.orElse("No value found"));
 
    //flatMap與map(Funtion)非常相似,區別在於lambda表示式的返回值。
    //map方法的lambda表示式返回值可以是任何型別,但是返回值會包裝成Optional例項。
    //但是flatMap方法的lambda返回值總是Optional型別。
    upperName = name.flatMap((value) -> Optional.of(value.toUpperCase()));
    System.out.println(upperName.orElse("No value found"));
 
    //filter方法檢查Optiona值是否滿足給定條件。
    //如果滿足返回Optional例項值,否則返回空Optional。
    Optional<String> longName = name.filter((value) -> value.length() > 6);
    System.out.println(longName.orElse("The name is less than 6 characters"));
 
    //另一個示例,Optional值不滿足給定條件。
    Optional<String> anotherName = Optional.of("Sana");
    Optional<String> shortName = anotherName.filter((value) -> value.length() > 6);
    System.out.println(shortName.orElse("The name is less than 6 characters"));
 
  }
 
}

輸出:

Sanaulla
No value present
The length of the value is: 8
There is no value present!
Sanaulla
Default Value
Sanaulla
No value present in the Optional instance
SANAULLA
SANAULLA
Sanaulla
The name is less than 6 characters