java8特性之Optional

java8特性之Optionaljava

optional是一個用來隱式進行非空檢測的一個容器,不須要顯式的進行null之判斷 構造函數所有私有化,因此提供了3個靜態公開的方法進行optional的初始化,下來咱們學習一下!app

初始化:
 Optional<T> Optional.empty()
 Optional<T> Optional.of(T value)
 Optional<T> Optional.ofNullable(T value)
 從上到下進行講解,
 方法一直接獲得一個空值得Optional容器;
 方法二,value爲null時報空指針異常,不然返回value值的Optional容器
 方法三,value爲null返回一個空值Optional對象,至關於調用了方法一,不然返回value值的Optional容器

得到null檢測結果:
 
boolean isPresent() optional容器爲空,返回false,不然返回true

得到Optional對象的值:
 T get() 空容器,報NoSuchElementException,不然返回容器中的值

值非空,則進行消費:
 
void ifPresent(Consumer<? super T> consumer) optional容器中值爲null,不作任何處理;不然進行括號中的消費處理,consumer爲null,拋出空指針

空值的默認值處理:
 T orElse(T other)
 T orElseGet(Supplier<?
extends T> other)
 <
X extends Throwable>T orElseThrow(Supplier<? extends X> exceptionSupplier)
 
方法一,optional容器中值爲null,返回other值爲默認值,否者返回optional容器中值
 方法二,optional容器中值爲null,返回Supplier接口返回值爲默認值,不然返回optional容器中值
 方法三,optional容器中值爲null,拋出exceptionSupplier接口生成的異常,不然返回optional容器中值

 非null的轉化處理:
 Optional<U> map(Function<?
super T,? extends U> mapper)
 Optional<U> flatMap(Function<?
super T,Optional<U>> mapper)
 
方法一,optional容器中值爲null,返回空optional,不然進行Function函數得到轉換值的Optional容器,mapper爲null拋出空指針
 方法二,optional容器中值爲null,返回空optional,不然進行Function函數得到轉換值的Optional容器,mapper爲null拋出空指針
 區別:方法一,mapper返回結果會自動進行Optional封裝,而方法二返回結果不會進行自動封裝,因此方法二返回結果必須爲Optional

 判斷過濾:
 Optional<T> filter(Predict<?
super T> predict)
 optional
容器中值不爲null,且符合斷言,則返回該值的Optional,不然返回空的Optional函數

 

下來看示例:學習

//初始化
Optional<Integer> empty = Optional.empty();
Optional<Integer> value1 = Optional.of(1);
Optional<Integer> value = Optional.ofNullable(null);

// 得到值
System.out.println(value1.get());                                                    //1

//判斷空值
System.out.println(value1.isPresent());                                              //true

//非空進行消費,非空打印,不然不進行打印
value1.ifPresent(v -> {
    System.out.println(v);                                                           //1
});
// 或 value1.ifPresent(System.out::print);

//默認值處理
System.out.println(empty.orElse(5));                                          //結果5
System.out.println(value1.orElse(5));                                         //結果1
System.out.println(empty.orElseGet(()->{return 8;}));                               //結果8
try {
    System.out.println(value.orElseThrow(()-> new Exception("我發現了null")));     //拋出自定義異常
} catch (Exception e) {
    e.printStackTrace();
}

//轉換
System.out.println(value1.map(a -> (a + 1)).get());                                 //2
System.out.println(value1.flatMap(a -> Optional.of(a+1)).get());                    //2

//過濾
System.out.println(value1.filter(a -> (a>0)).get());                                //1
相關文章
相關標籤/搜索