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