Java8 Optional類


Optional用於包含非空物件的容器物件。Optional物件,用於表示使用不存在null值。這個類有各種實用的方法,以方便程式碼來處理為可用或不可用,而不是檢查null值。它是Java引入, 是類似於在 Guava 中的 Optional 。

類宣告

以下是java.util.Optional<T>類的宣告:

public final class Optional<T>
   extends Object

類方法

S.N. 方法及說明
1 static <T> Optional<T> empty()
返回一個空的 Optional 範例。
2 boolean equals(Object obj)
表示某個其他物件是否“等於”此Optional。
3 Optional<T> filter(Predicate<? super T> predicate) 
如果值存在,並且該值給定的謂詞匹配,返回一個可選描述值,否則返回一個空Optional。
4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
如果值存在,應用提供的可選承載對映功能到它,返回結果,否則返回一個空Optional。
5 T get()
如果值是出現在這個 Optional 中,返回這個值,否則丟擲NoSuchElementException異常。
6 int hashCode()
返回當前值,雜湊碼值(如有)或0(零),如果值不存在。
7 void ifPresent(Consumer<? super T> consumer)
如果值存在,呼叫指定的使用方提供值,否則什麼都不做。
8 boolean isPresent()
返回true,如果有一個值存在,否則為false。
9 <U> Optional<U> map(Function<? super T,? extends U> mapper)
如果值存在,應用提供的對映函式,如果結果非空,返回一個Optional描述結果。
10 static <T> Optional<T> of(T value)
返回一個Optional具有指定當前非空值。
11 static <T> Optional<T> ofNullable(T value)
返回一個Optional描述指定的值,如果非空,否則返回一個空的Optional。
12 T orElse(T other)
返回值(如果存在),否則返回other。
13 T orElseGet(Supplier<? extends T> other)
如果存在,返回值,否則呼叫其他並返回撥用的結果。
14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)
返回所含值,如果存在的話,否則丟擲將由提供者建立的一個例外。
15 String toString()
返回此Optional適合偵錯一個非空字串表示。

方法繼承

這個類從以下類繼承的方法:

  • java.lang.Object

Optional 例子

選擇使用任何編輯器建立以下java程式在 C:/> JAVA

Java8Tester.java
import java.util.Optional;

public class Java8Tester {
   public static void main(String args[]){
      Java8Tester java8Tester = new Java8Tester();

      Integer value1 =  null;
      Integer value2 =  new Integer(10);
      //Optional.ofNullable - allows passed parameter to be null.
      Optional<Integer> a = Optional.ofNullable(value1);
      //Optional.of - throws NullPointerException if passed parameter is null
      Optional<Integer> b = Optional.of(value2);		

      System.out.println(java8Tester.sum(a,b));
   }

   public Integer sum(Optional<Integer> a, Optional<Integer> b){
      //Optional.isPresent - checks the value is present or not
      System.out.println("First parameter is present: " + a.isPresent());

      System.out.println("Second parameter is present: " + b.isPresent());

      //Optional.orElse - returns the value if present otherwise returns
      //the default value passed.
      Integer value1 = a.orElse(new Integer(0));	

      //Optional.get - gets the value, value should be present
      Integer value2 = b.get();

      return value1 + value2;
   }	
}

驗證結果

使用javac編譯器編譯如下類

C:\JAVA>javac Java8Tester.java

現在執行Java8Tester看到的結果

C:\JAVA>java Java8Tester

看到結果。

First parameter is present: false
Second parameter is present: true
10