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

Java?8?Optional解決空指針問題全面解析

 更新時(shí)間:2025年10月24日 16:36:48   作者:一成在成長  
在Java編程中,空指針異常(NullPointerException)是一個(gè)常見的錯(cuò)誤,經(jīng)常會導(dǎo)致程序的崩潰或不可預(yù)料的行為,下面通過本文給大家介紹Java8 Optional解決空指針問題,感興趣的朋友跟隨小編一起看看吧

在Java 8中,Optional類是一個(gè)非常重要的特性,旨在減少代碼中的空指針異常(NullPointerException)。Optional類是java.util包的一部分,它是一個(gè)可以為null的引用或者一個(gè)非null的值。使用Optional可以讓你更加優(yōu)雅地處理可能為null的情況,避免直接使用null值導(dǎo)致的空指針異常。

一、為什么需要 Optional

在傳統(tǒng) Java 編程中,如果對象不存在(比如數(shù)據(jù)庫查不到用戶),通常返回 null,這就像你去某個(gè)城市找朋友——結(jié)果“朋友家空無一人”。
于是我們不得不在每個(gè)地方加上判空邏輯:

if (mem != null) {
    System.out.println(mem.getName());
}

這就像你每次出門都要確認(rèn)朋友家是不是有人,十分麻煩。而 Optional 就是一個(gè)智能快遞柜——

它告訴你:這個(gè)格子里可能有包裹,也可能是空的,但不會讓你“踩空”。

二、創(chuàng)建 Optional 的三種方式

方法含義城市類比
Optional.empty()創(chuàng)建一個(gè)空盒子空快遞柜,沒有包裹
Optional.of(value)創(chuàng)建一個(gè)非空盒子(不能為 null)放了包裹的柜子
Optional.ofNullable(value)創(chuàng)建一個(gè)可空盒子可能有包裹,也可能沒有
Optional<String> opt1 = Optional.empty();
Optional<String> opt2 = Optional.of("一成");
Optional<String> opt3 = Optional.ofNullable(null);

三、判斷是否有值

方法說明類比
isPresent()判斷盒子里有沒有東西看柜門上有沒有“取件提示燈”亮
isEmpty()(Java 11+)判斷盒子是不是空的燈沒亮就是空的
Optional<String> opt = Optional.of("數(shù)據(jù)");
System.out.println(opt.isPresent()); // true

四、ifPresent:非空時(shí)執(zhí)行動作

不用寫 if 判空,而是讓 Optional 自動幫你執(zhí)行:

opt.ifPresent(str -> System.out.println(str.length()));

類比:

你設(shè)置了一個(gè)提醒器——“如果包裹到了,就發(fā)短信告訴我”;沒到就靜靜等待。

Java 9 之后還可以這樣:

opt.ifPresentOrElse(
    str -> System.out.println(str.length()),
    () -> System.out.println("為空")
);

五、默認(rèn)值(orElse / orElseGet)

  • orElse():無論有沒有包裹,都先去取默認(rèn)包裹(性能略差)
  • orElseGet():只有真空柜時(shí),才生成默認(rèn)包裹(性能更好)
String name = Optional.ofNullable(null).orElse("默認(rèn)名");
String name2 = Optional.ofNullable(null).orElseGet(() -> "默認(rèn)名");

類比:

orElse 是“先去倉庫拿備用包裹再來看柜子”;
orElseGet 是“只有柜子真空了才讓倉庫發(fā)貨”。

六、get():危險(xiǎn)的取值方法

get() 就像強(qiáng)行撬柜門——如果柜子是空的會拋異常:

opt.get(); // 如果為空,拋 NoSuchElementException

不推薦使用,應(yīng)改用 orElseGet()ifPresent()

七、filter():過濾條件

Optional<String> pwd = Optional.of("1234567");
boolean valid = pwd.filter(p -> p.length() > 6).isPresent();

類比:

快遞柜自動幫你過濾“不符合條件的包裹”,例如“包裹太大或太小”直接拒收。

可以組合多個(gè)條件:

Predicate<String> len6 = p -> p.length() > 6;
Predicate<String> len10 = p -> p.length() < 10;
pwd.filter(len6.and(len10)).isPresent();

八、map():轉(zhuǎn)換值

map() 是將盒子里的內(nèi)容按規(guī)則變形再放回盒子。

Optional<String> nameOpt = Optional.of("一成");
Optional<Integer> lenOpt = nameOpt.map(String::length);

類比:

你把包裹(字符串)拿出來,測量它的重量(長度),再放進(jìn)另一個(gè)盒子。

還可以結(jié)合 filter

Optional<String> opt = Optional.of("password");
boolean result = opt
    .map(String::toLowerCase)
    .filter(pwd -> !pwd.equals("password"))
    .isPresent();
操作方法功能類比推薦程度
創(chuàng)建空值Optional.empty()空柜子?
創(chuàng)建非空值Optional.of()有包裹的柜子?(參數(shù)不能為 null)
創(chuàng)建可空值Optional.ofNullable()不確定是否有包裹?
判斷存在isPresent() / isEmpty()查看燈亮不亮?
執(zhí)行動作ifPresent() / ifPresentOrElse()到貨通知?
默認(rèn)值orElse() / orElseGet()備用包裹?(推薦 orElseGet)
獲取值get()撬柜門?(可能拋異常)
條件過濾filter()包裹篩選?
值轉(zhuǎn)換map()包裹改造?

到此這篇關(guān)于Java 8 Optional解決空指針問題的文章就介紹到這了,更多相關(guān)Java  Optional空指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • spring,mybatis事務(wù)管理配置與@Transactional注解使用詳解

    spring,mybatis事務(wù)管理配置與@Transactional注解使用詳解

    這篇文章主要介紹了spring,mybatis事務(wù)管理配置與@Transactional注解使用,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Spring 依賴注入實(shí)現(xiàn)示例

    Spring 依賴注入實(shí)現(xiàn)示例

    這篇文章主要介紹了Spring 依賴注入實(shí)現(xiàn)示例的相關(guān)資料,幫助大家更好的理解和使用spring框架,感興趣的朋友可以了解下
    2020-11-11
  • Idea 快速生成方法返回值的操作

    Idea 快速生成方法返回值的操作

    這篇文章主要介紹了Idea 快速生成方法返回值的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java 實(shí)現(xiàn)KMP算法

    java 實(shí)現(xiàn)KMP算法

    這篇文章主要介紹了java 如何實(shí)現(xiàn)KMP算法,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-12-12
  • SpringBoot動態(tài)實(shí)現(xiàn)數(shù)據(jù)脫敏的實(shí)戰(zhàn)指南

    SpringBoot動態(tài)實(shí)現(xiàn)數(shù)據(jù)脫敏的實(shí)戰(zhàn)指南

    這篇文章主要為大家詳細(xì)介紹了SpringBoot動態(tài)實(shí)現(xiàn)數(shù)據(jù)脫敏的五種方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-12-12
  • springdoc openapi 接口轉(zhuǎn)換為JMeter測試計(jì)劃實(shí)踐指南

    springdoc openapi 接口轉(zhuǎn)換為JMeter測試計(jì)劃實(shí)踐指南

    本文介紹了基于Springdoc-openapi自動暴露OpenAPI文檔,并通過OpenAPIGenerator生成JMeter測試計(jì)劃的方法,詳細(xì)步驟包括啟動服務(wù)、驗(yàn)證OpenAPI文檔可用性、使用OpenAPIGenerator生成JMeter腳本以及安裝JMeter,感興趣的朋友一起看看
    2026-04-04
  • Java數(shù)組添加元素實(shí)例

    Java數(shù)組添加元素實(shí)例

    這篇文章主要介紹了Java數(shù)組添加元素實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解

    RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解

    這篇文章主要介紹了RocketMQ的消費(fèi)者類型與最佳實(shí)踐詳解,在?RocketMQ?5.0?中,更加強(qiáng)調(diào)了客戶端類型的概念,尤其是消費(fèi)者類型,為了滿足多樣的?RocketMQ?中一共有三種不同的消費(fèi)者類型,分別是?PushConsumer、SimpleConsumer?和?PullConsumer,需要的朋友可以參考下
    2023-10-10
  • 都9102年了,你還用for循環(huán)操作集合嗎

    都9102年了,你還用for循環(huán)操作集合嗎

    這篇文章主要給大家介紹了關(guān)于java中for循環(huán)操作集合使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 利用Java編寫24點(diǎn)小游戲的實(shí)例代碼

    利用Java編寫24點(diǎn)小游戲的實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于如何利用Java編寫24點(diǎn)小游戲的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01

最新評論

镇沅| 碌曲县| 林口县| 和平县| 平舆县| 平谷区| 萍乡市| 黄平县| 车险| 江华| 都昌县| 玉屏| 定安县| 邵东县| 永和县| 泾阳县| 道孚县| 桐乡市| 凭祥市| 遵化市| 乌兰察布市| 溧阳市| 建瓯市| 沈阳市| 思南县| 寿光市| 基隆市| 石渠县| 教育| 中山市| 平遥县| 邵阳县| 重庆市| 泗水县| 城固县| 灵璧县| 商河县| 拉孜县| 阿荣旗| 晋中市| 盐池县|