最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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 提供很多有用的方法,這樣我們就不用顯式進行空值檢測。

代碼示例

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 中保存的值進行函數(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如果有值則將其返回,否則返回一個默認值
orElseGet如果有值則將其返回,否則返回一個由指定的 Supplier 接口生成的值
orElseThrow如果有值則將其返回,否則拋出一個由指定的 Supplier 接口生成的異常

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

相關(guān)文章

  • java.lang.IllegalArgumentException:Invalid character found異常解決

    java.lang.IllegalArgumentException:Invalid character&nb

    本文介紹了java.lang.IllegalArgumentException: Invalid character found異常的解決,方法包括檢查代碼中的方法名,使用合適的HTTP請求方法常量,使用第三方HTTP庫,檢查請求URL以及使用調(diào)試和日志工具,通過這些方法,我們可以解決異常并確保網(wǎng)絡(luò)應(yīng)用程序的正常運行
    2023-10-10
  • Spring Boot 與 Kotlin 使用JdbcTemplate連接MySQL數(shù)據(jù)庫的方法

    Spring Boot 與 Kotlin 使用JdbcTemplate連接MySQL數(shù)據(jù)庫的方法

    本文介紹在Spring Boot基礎(chǔ)下配置數(shù)據(jù)源和通過 JdbcTemplate 編寫數(shù)據(jù)訪問的示例。感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-01-01
  • 詳解 Java中日期數(shù)據(jù)類型的處理之格式轉(zhuǎn)換的實例

    詳解 Java中日期數(shù)據(jù)類型的處理之格式轉(zhuǎn)換的實例

    這篇文章主要介紹了詳解 Java中日期數(shù)據(jù)類型的處理之格式轉(zhuǎn)換的實例的相關(guān)資料,日期以及時間格式處理,在Java中時間格式一般會涉及到的數(shù)據(jù)類型包括Calendar類和Date類,需要的朋友可以參考下
    2017-08-08
  • JDBC操作數(shù)據(jù)庫的增加、刪除、更新、查找實例分析

    JDBC操作數(shù)據(jù)庫的增加、刪除、更新、查找實例分析

    這篇文章主要介紹了JDBC操作數(shù)據(jù)庫的增加、刪除、更新、查找方法,以完整實例形式分析了Java基于JDBC連接數(shù)據(jù)庫及進行數(shù)據(jù)的增刪改查等技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 使用feign客戶端傳參接收不到的問題及解決

    使用feign客戶端傳參接收不到的問題及解決

    這篇文章主要介紹了使用feign客戶端傳參接收不到的問題及解決,具有很好的參考價值,希望對大家有所幫助。
    2022-03-03
  • Mybatis-plus3.4.3下使用lambdaQuery報錯解決

    Mybatis-plus3.4.3下使用lambdaQuery報錯解決

    最近在使用lambdaQuery().eq(CommonUser::getOpenId, openId).one()進行查詢報錯,本文主要介紹了Mybatis-plus3.4.3下使用lambdaQuery報錯解決,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • Spring中的ThreadPoolTaskExecutor線程池使用詳解

    Spring中的ThreadPoolTaskExecutor線程池使用詳解

    這篇文章主要介紹了Spring中的ThreadPoolTaskExecutor線程池使用詳解,ThreadPoolTaskExecutor 是 Spring框架提供的一個線程池實現(xiàn),用于管理和執(zhí)行多線程任務(wù),它是TaskExecutor接口的實現(xiàn),提供了在 Spring 應(yīng)用程序中創(chuàng)建和配置線程池的便捷方式,需要的朋友可以參考下
    2024-01-01
  • Java基礎(chǔ)知識精通塊作用域與條件及switch語句

    Java基礎(chǔ)知識精通塊作用域與條件及switch語句

    塊(block,即復(fù)合語句)是指由若干條 Java 語句組成的語句,并由一對大括號括起來。塊確定了變量的作用域。一個塊可以嵌套在另一個塊中;條件語句、switch語句是我們常見會用到的結(jié)構(gòu),感興趣的朋友來看看吧
    2022-04-04
  • java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例

    這篇文章主要介紹了java利用mybatis攔截器統(tǒng)計sql執(zhí)行時間示例,該攔截器攔截mybatis的query和update操作,能統(tǒng)計sql執(zhí)行時間
    2014-03-03
  • SpringBoot+Docker+K8s云原生部署全流程(從零到發(fā)布)

    SpringBoot+Docker+K8s云原生部署全流程(從零到發(fā)布)

    本文詳解了SpringBoot項目從開發(fā)到基于Docker容器化,再通過K8s實現(xiàn)云原生部署的全流程,涵蓋環(huán)境搭建、鏡像構(gòu)建、服務(wù)部署及CI/CD自動化,提升應(yīng)用部署效率與可維護性,需要的朋友跟隨小編一起學(xué)習(xí)吧
    2025-08-08

最新評論

宁城县| 吴忠市| 汝城县| 洛浦县| 河西区| 鄂托克旗| 怀化市| 雷州市| 蒙阴县| 合川市| 宣恩县| 广昌县| 平定县| 静宁县| 白玉县| 内江市| 武城县| 内丘县| 马尔康县| 桓台县| 嘉义县| 通许县| 磐石市| 丰台区| 岳阳县| 云林县| 老河口市| 昌江| 绥德县| 溧水县| 错那县| 黑山县| 都昌县| 定日县| 平乡县| 遂溪县| 罗定市| 奎屯市| 磐安县| 湖口县| 北票市|