天天看點

Java 8 Optional 類 學習

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/u010046908/article/details/62216945

1. Optional類的簡介

Optional 類是一個可以為null的容器對象。如果值存在則isPresent()方法會傳回true,調用get()方法會傳回該對象。

Optional 是個容器:它可以儲存類型T的值,或者僅僅儲存null。Optional提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

Optional 類的引入很好的解決空指針異常。

2.類聲明

以下是一個 java.util.Optional 類的聲明:

public final class Optional<T> extends Object           

3.類方法

  • static Optional empty() 傳回空的 Optional 執行個體。
  • boolean equals(Object obj) 判斷其他對象是否等于 Optional。
  • Optional filter(Predicate< ? super predicate如果值存在,并且這個值比對給定的 predicate,傳回一個Optional用以描述這個值,否則傳回一個空的Optional。
  • Optional flatMap(Function< ? super T,Optional> mapper)

    如果值存在,傳回基于Optional包含的映射方法的值,否則傳回一個空的Optional

  • T get()

    如果在這個Optional中包含這個值,傳回值,否則抛出異常:NoSuchElementException

  • int hashCode()

    傳回存在值的哈希碼,如果值不存在 傳回 0。

  • void ifPresent(Consumer< ? super T> consumer)

    如果值存在則使用該值調用 consumer , 否則不做任何事情。

  • boolean isPresent()

    如果值存在則方法會傳回true,否則傳回 false。

  • Optional map(Function< ? super T, ? extends U> mapper)

    如果存在該值,提供的映射方法,如果傳回非null,傳回一個Optional描述結果。

  • static Optional of(T value)

    傳回一個指定非null值的Optional。

  • static Optional ofNullable(T value)

    如果為非空,傳回 Optional 描述的指定值,否則傳回空的 Optional。

  • T orElse(T other) 如果存在該值,傳回值, 否則傳回 other。
  • T orElseGet(Supplier< ? extends T> other)

    如果存在該值,傳回值, 否則觸發 other,并傳回 other 調用的結果。

  • T orElseThrow(Supplier< ? extends X> exceptionSupplier)如果存在該值,傳回包含的值,否則抛出由 Supplier 繼承的異常
  • String toString() 傳回一個Optional的非空字元串,用來調試。

3.Optional 執行個體

我們可以通過以下執行個體來更好的了解 Optional 類的使用:

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 - 允許傳遞為 null 參數
      Optional<Integer> a = Optional.ofNullable(value1);

      // Optional.of - 如果傳遞的參數是 null,抛出異常 NullPointerException
      Optional<Integer> b = Optional.of(value2);
      System.out.println(java8Tester.sum(a,b));
   }

   public Integer sum(Optional<Integer> a, Optional<Integer> b){

      // Optional.isPresent - 判斷值是否存在

      System.out.println("第一個參數值存在: " + a.isPresent());
      System.out.println("第二個參數值存在: " + b.isPresent());

      // Optional.orElse - 如果值存在,傳回它,否則傳回預設值
      Integer value1 = a.orElse(new Integer(0));

      //Optional.get - 擷取值,值需要存在
      Integer value2 = b.get();
      return value1 + value2;
   }
}           

結果:

第一個參數值存在: false
第二個參數值存在: true
10