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

Java?8?Optional解決空指針問(wèn)題全面解析

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

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

一、為什么需要 Optional

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

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

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

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

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

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

三、判斷是否有值

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

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

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

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

類(lèi)比:

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

Java 9 之后還可以這樣:

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

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

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

類(lèi)比:

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

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

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

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

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

七、filter():過(guò)濾條件

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

類(lèi)比:

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

可以組合多個(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);

類(lèi)比:

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

還可以結(jié)合 filter

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

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

相關(guān)文章

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

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

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

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

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

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

    這篇文章主要介紹了Idea 快速生成方法返回值的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    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動(dòng)態(tài)實(shí)現(xiàn)數(shù)據(jù)脫敏的實(shí)戰(zhàn)指南

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

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

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

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

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

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

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

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

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

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

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

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

最新評(píng)論

焦作市| 麻阳| 会宁县| 定结县| 通化县| 宜春市| 永德县| 都匀市| 昌吉市| 嘉义市| 科尔| 洪雅县| 连州市| 东阿县| 长白| 宁津县| 额济纳旗| 辰溪县| 扬州市| 蓝田县| 甘洛县| 政和县| 西乡县| 蚌埠市| 巴彦县| 襄樊市| 南陵县| 巫山县| 慈利县| 镇康县| 富源县| 吉木萨尔县| 独山县| 开江县| 井研县| 平乡县| 安远县| 靖安县| 炎陵县| 米泉市| 麻城市|