欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java8新特性之Optional使用詳解

 更新時間:2023年08月30日 10:36:45   作者:余生海  
這篇文章主要介紹了Java8新特性之Optional使用詳解,為了解決空指針異常更加優(yōu)雅,Java8?提供了?Optional?類庫,Optional?實際上是個容器,它可以保存類型T的值,或者僅僅保存null,,需要的朋友可以參考下

簡介

  • 空指針異常是導(dǎo)致Java應(yīng)用程序失敗的最常見原因。
  • 為了解決空指針異常更加優(yōu)雅,Java8 提供了 Optional 類庫。
  • Optional 實際上是個容器:它可以保存類型T的值,或者僅僅保存null。
  • Optional 提供很多有用的方法,這樣我們就不用顯式進(jìn)行空值檢測。

代碼示例

Optional.of() 或者 Optional.ofNullable() :創(chuàng)建 Optional 對象,差別在于 of 不允許參數(shù)是 null ,而 ofNullable 則無限制。

// 參數(shù)不能是null
Optional optional1 = Optional.of(1);
// 參數(shù)可以是null
Optional optional2 = Optional.ofNullable(null);
// 參數(shù)可以是非null
Optional optional3 = Optional.ofNullable(2);

Optional.empty() :所有null包裝成的 Optional 對象

Optional optional1 = Optional.ofNullable(null);
Optional optional2 = Optional.ofNullable(null);
System.out.println(optional1 == optional2);// true
System.out.println(optional1 == Optional.empty());// true
Object o1 = Optional.empty();
Object o2 = Optional.empty();
System.out.println(o1 == o2);// true

isPresent() :判斷值是否存在

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// isPresent判斷值是否存在
System.out.println(optional1.isPresent() == true);
System.out.println(optional2.isPresent() == false);

ifPresent(Consumer consumer) :如果option對象保存的值不是null,則調(diào)用consumer對象,否則不調(diào)用

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// 如果不是null,調(diào)用Consumer
optional1.ifPresent(new Consumer<Integer>() {
   @Override
   public void accept(Integer t) {
      System.out.println("value is " + t);
   }
});
// null,不調(diào)用Consumer
optional2.ifPresent(new Consumer<Integer>() {
   @Override
   public void accept(Integer t) {
      System.out.println("value is " + t);
   }
});

orElse(value) :如果optional對象保存的值不是 null ,則返回原來的值,否則返回 value

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
// orElse
System.out.println(optional1.orElse(1000) == 1);// true
System.out.println(optional2.orElse(1000) == 1000);// true

orElseGet(Supplier supplier) :功能與 orElse 一樣,只不過 orElseGet 參數(shù)是一個對象

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
System.out.println(optional1.orElseGet(() -> 1000) == 1);//true
System.out.println(optional2.orElseGet(() -> 1000) == 1000);//true

orElseThrow() :值不存在則拋出異常,存在則什么不做,有點類似 Guava 的 Precoditions

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
optional1.orElseThrow(() -> {
   throw new IllegalStateException();
});
try {
   optional2.orElseThrow(() -> {
      throw new IllegalStateException();
   });
} catch (IllegalStateException e) {
   e.printStackTrace();
}

filter(Predicate) :判斷 Optional 對象中保存的值是否滿足 Predicate ,并返回新的 Optional 。

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
Optional<Integer> filter1 = optional1.filter((a) -> a == null);
Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
Optional<Integer> filter3 = optional2.filter((a) -> a == null);
System.out.println(filter1.isPresent());// false
System.out.println(filter2.isPresent());// true
System.out.println(filter2.get().intValue() == 1);// true
System.out.println(filter3.isPresent());// false

map(Function) :對 Optional 中保存的值進(jìn)行函數(shù)運算,并返回新的 Optional (可以是任何類型)

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Integer> optional2 = Optional.ofNullable(null);
Optional<String> str1Optional = optional1.map((a) -> "key" + a);
Optional<String> str2Optional = optional2.map((a) -> "key" + a);
System.out.println(str1Optional.get());// key1
System.out.println(str2Optional.isPresent());// false

flatMap() :功能與 map() 相似,差別請看如下代碼。 flatMap 方法與 map 方法類似,區(qū)別在于 mapping 函數(shù)的返回值不同。 map 方法的 mapping 函數(shù)返回值可以是任何類型 T ,而 flatMap 方法的 mapping 函數(shù)必須是 Optional 。

Optional<Integer> optional1 = Optional.ofNullable(1);
Optional<Optional<String>> str1Optional = optional1.map((a) -> Optional.of("key" + a));
Optional<String> str2Optional = optional1.flatMap((a) -> Optional.of("key" + a));
System.out.println(str1Optional.get().get());// key1
System.out.println(str2Optional.get());// key1

Optional類的方法

方法描述
empty返回一個空的 Optional 實例
filter如果值存在并且滿足提供的斷言, 就返回包含該值的 Optional 對象;否則返回一個空的 Optional 對象
map如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調(diào)用
flatMap如果值存在,就對該值執(zhí)行提供的 mapping 函數(shù)調(diào)用,返回一個 Optional 類型的值,否則就返 回一個空的 Optional 對象
get如果該值存在,將該值用 Optional 封裝返回,否則拋出一個 NoSuchElementException 異常
ifPresent如果值存在,就執(zhí)行使用該值的方法調(diào)用,否則什么也不做
isPresent如果值存在就返回 true,否則返回 false
of將指定值用 Optional 封裝之后返回,如果該值為 null,則拋出一個 NullPointerException 異常
ofNullable將指定值用 Optional 封裝之后返回,如果該值為 null,則返回一個空的 Optional 對象
orElse如果有值則將其返回,否則返回一個默認(rèn)值
orElseGet如果有值則將其返回,否則返回一個由指定的 Supplier 接口生成的值
orElseThrow如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常

到此這篇關(guān)于Java8新特性之Optional使用詳解的文章就介紹到這了,更多相關(guān)Java8的Optional內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論