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

一文詳解Java如何優(yōu)雅地判斷對(duì)象是否為空

 更新時(shí)間:2024年04月28日 08:30:41   作者:孤蓬&聽雨  
這篇文章主要給大家介紹了關(guān)于Java如何優(yōu)雅地判斷對(duì)象是否為空的相關(guān)資料,在Java中可以使用以下方法優(yōu)雅地判斷一個(gè)對(duì)象是否為空,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

1. 前言

在實(shí)際項(xiàng)目中,我們經(jīng)常需要對(duì)各種變量或?qū)ο筮M(jìn)行判空校驗(yàn)。這是因?yàn)?,如果不進(jìn)行判空校驗(yàn),當(dāng)遇到空值時(shí),可能會(huì)導(dǎo)致程序出現(xiàn)NullPointerException異常。這是一種常見的運(yùn)行時(shí)異常,它會(huì)在試圖訪問或操作空對(duì)象引用時(shí)發(fā)生。為了避免這種異常的出現(xiàn),我們需要在使用變量或?qū)ο笾?,進(jìn)行仔細(xì)的判空校驗(yàn),以確保它們的值是有效的,或者它們不是空值。通過進(jìn)行判空校驗(yàn),我們可以更好地保證程序的穩(wěn)定性和可靠性,避免潛在的錯(cuò)誤和異常。

2. 如何判斷為null

2.1 常用判斷

判斷一個(gè)對(duì)象是否為null有多種方式。除了你提到的java.util中的Objects.nonNull(obj)和hutool中的ObjectUtil,還有其他一些常見的方法。以下是這些方法的詳細(xì)描述:

  • java.util.Objects.nonNull(obj)這是Java標(biāo)準(zhǔn)庫提供的一種方法,它檢查給定的對(duì)象是否為null。如果對(duì)象不為null,則返回true;否則返回false。
  • hutool中的ObjectUtilHutool是一個(gè)Java工具包,提供了許多實(shí)用的工具方法。ObjectUtil類中也有一個(gè)判斷對(duì)象是否為null的方法。使用Hutool的ObjectUtil,你可以像這樣檢查一個(gè)對(duì)象是否為null:ObjectUtil.isNotNull(obj)
  • null != obj這是一種傳統(tǒng)的比較方式,直接使用"!="運(yùn)算符來檢查一個(gè)對(duì)象是否為null。如果obj不為null,則表達(dá)式的結(jié)果為false;如果obj為null,則表達(dá)式的結(jié)果為true。

2.2 List的判空

像List這種比較特殊的在項(xiàng)目中可能不僅僅是判斷非空了。對(duì)于List來說不等于null和List.size()不等于0是兩回事,公司也有實(shí)習(xí)生常常有把這兩個(gè)混淆的情況,list不等于null說明已經(jīng)初始化了,堆內(nèi)存中有一塊屬于它的地盤,而size為0說明還沒往里面放東西,舉個(gè)例子說就是不等于null代表我現(xiàn)在有個(gè)瓶子,size大于0說明我向瓶子里裝水了。

來看一下源碼:

public boolean isEmpty(List list) {
     if (list != null && list.size() > 0) {
         return false;
     } else {
         return true;
     }
 }

相當(dāng)于判斷瓶子里有沒有水(前提是瓶子已經(jīng)存在,若瓶子不存在,則會(huì)拋出NullPointerException異常)。

所以通常情況下會(huì)連用list != null && list.size > 0 來判斷,或者直接使用HuTool中CollUtil工具的isEmpty。諸如此類的還有Set、Map等。

2.3 String的判空

這里還是用瓶子與水的概念,String為null時(shí)調(diào)用equals(String) 或 length() 等操作拋出 java.lang.NullPointerException。

private void test() {
    String str1 = null;
    //這里將拋出異常
    if (str1.equals("")) {
    }

    //這里將拋出異常
    if (str1.length() > 0) {
    }
}

針對(duì)字符串判空有以下幾種方式:

1、大多數(shù)人使用的方法之一,直觀,方便,但效率低下:

if(a == null || a.equals(""));

2、比較字符串長度,高效:

if(a == null || a.length() == 0);

3、Java SE 6.0 才剛剛開始提供,效率和方法二差不多:

if(a == null || a.isEmpty());

當(dāng)然還可以使用org.apache.commons.lang.StringUtils工具。

StringUtils.isNotBlank(a);

  • StringUtils.isNotBlank(null) = false
  • StringUtils.isNotBlank(“”) = false
  • StringUtils.isNotBlank(" ") = false
  • StringUtils.isNotBlank(“bob”) = true
  • StringUtils.isNotBlank(" bob ") = true

該工具類中還有個(gè)isNotEmpty()方法,從注釋可以很明顯看出二者的差別

StringUtils.isNotEmpty(a);

  • StringUtils.isNotEmpty(null) = false
  • StringUtils.isNotEmpty(“”) = false
  • StringUtils.isNotEmpty(" ") = true
  • StringUtils.isNotEmpty(“bob”) = true
  • StringUtils.isNotEmpty(" bob ") = true

2.4 Optional

Optional的出現(xiàn)就是用來防止NullpointException的。常見的方法有:

  • .empty() 創(chuàng)建一個(gè)空的Optional實(shí)例
  • .of(T t): 創(chuàng)建一個(gè)Optional 實(shí)例,為null時(shí)報(bào)異常
  • .ofNullable(T t): 若t 不為null,創(chuàng)建Optional 實(shí)例,否則創(chuàng)建空實(shí)例
  • isPresent(): 判斷容器中是否有值
  • ifPresent(Consume lambda) 容器若不為空則執(zhí)行括號(hào)中的Lambda表達(dá)式
  • orElse(T t): 獲取容器中的元素,若容器為空則返回括號(hào)中的默認(rèn)值
  • orElseGet(Supplier s): 如果調(diào)用對(duì)象包含值,返回該值,否則返回s 獲取的值
  • orElseThrow(): 如果為空,就拋出定義的異常,如果不為空返回當(dāng)前對(duì)象
  • map(Function f): 如果有值對(duì)其處理,并返回處理后的Optional,否則返回Optional.empty()
  • flatMap(Function mapper): 與map 類似,要求返回值必須是Optional
  • T get() 獲取容器中的元素,若容器為空則拋出NoSuchElement異常

先看個(gè)常見的示例:

baseInfo類中有布爾類型的屬性,是空返回false,不為空取其值,需要四行。

boolean blind = false;
if (null != baseInfo.getBlind()) {
    blind = baseInfo.getBlind();
}

當(dāng)使用Optional時(shí),一行搞定,非常的優(yōu)雅。

boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse(false);

Java中的Optional 是一個(gè)可以為null的容器對(duì)象。如果值存在則isPresent()方法返回true。調(diào)用get()方法會(huì)返回該對(duì)象。

創(chuàng)建Optional對(duì)象的方式有三種:

  • 創(chuàng)建一個(gè)空的Optional對(duì)象:Optional.empty()。
  • 使用非null值創(chuàng)建Optional對(duì)象:Optional.of(T value)。
  • 使用任意值創(chuàng)建Optional對(duì)象:Optional.ofNullable(T value)。

Optional對(duì)象的使用場景主要是處理空指針異常的情況,相當(dāng)于一個(gè)容器,當(dāng)往里面存放對(duì)象時(shí),如果對(duì)象為空(null),Optional會(huì)返回一個(gè)空的Optional實(shí)例,反之會(huì)返回一個(gè)非空的Optional實(shí)例。

以下是使用Optional對(duì)象的示例:

Optional<String> optional = Optional.ofNullable("test");  
optional.isPresent();           // true  
optional.get();                 // "test"  
optional.orElse("fallback");     // "test"  
  
optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "t"

以上代碼中,首先創(chuàng)建了一個(gè)包含字符串"test"的Optional對(duì)象。然后使用isPresent()方法檢查該值是否為null,使用get()方法獲取該值。接下來使用ifPresent()方法檢查值是否存在,如果存在則執(zhí)行l(wèi)ambda表達(dá)式中的代碼。在這個(gè)例子中,輸出結(jié)果是"t"。

總結(jié)來說,Java中的Optional對(duì)象可以用于避免空指針異常的情況,它提供了一種更優(yōu)雅、更簡潔的方式來處理可能為空的值。

3. 總結(jié)

每種方法都有其適用的場景,鏈?zhǔn)骄幊桃膊焕狻km然它可以使代碼更優(yōu)雅,但可能會(huì)降低邏輯性和可讀性。因此,在項(xiàng)目中使用時(shí),需要根據(jù)具體情況慎重考慮。

到此這篇關(guān)于Java如何優(yōu)雅地判斷對(duì)象是否為空的文章就介紹到這了,更多相關(guān)Java判斷對(duì)象是否為空內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java開發(fā)必備知識(shí)之?dāng)?shù)組詳解

    Java開發(fā)必備知識(shí)之?dāng)?shù)組詳解

    數(shù)組對(duì)于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同.本篇文章為大家整理了Java最全關(guān)于數(shù)組的知識(shí)點(diǎn),并給出其對(duì)應(yīng)的代碼,需要的朋友可以參考下
    2021-06-06
  • Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(9)

    Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(9)

    下面小編就為大家?guī)硪黄狫ava基礎(chǔ)的幾道練習(xí)題(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧,希望可以幫到你
    2021-07-07
  • Spring使用xml方式整合第三方框架流程詳解

    Spring使用xml方式整合第三方框架流程詳解

    這篇文章主要介紹了Spring使用xml方式整合第三方框架流程,Spring會(huì)在應(yīng)用上下文中為某個(gè)bean尋找其依賴的bean,Spring中bean有三種裝配機(jī)制,分別是:在xml中顯式配置、在java中顯式配置、隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配
    2023-02-02
  • MyBatis-Plus中更新操作的兩種實(shí)現(xiàn)

    MyBatis-Plus中更新操作的兩種實(shí)現(xiàn)

    本文主要介紹了MyBatis-Plus中更新操作的兩種實(shí)現(xiàn),主要是通過id更新和條件更新,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java設(shè)計(jì)模式之監(jiān)聽器模式實(shí)例詳解

    Java設(shè)計(jì)模式之監(jiān)聽器模式實(shí)例詳解

    這篇文章主要介紹了Java設(shè)計(jì)模式之監(jiān)聽器模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了java設(shè)計(jì)模式中監(jiān)聽器模式的概念、原理及相關(guān)實(shí)現(xiàn)與使用技巧,需要的朋友可以參考下
    2018-02-02
  • 原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象

    原理分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象

    這篇文章主要為大家介紹分析SonarQube中IdentityProvider賬戶互斥現(xiàn)象原理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • java 動(dòng)態(tài)代理的方法總結(jié)

    java 動(dòng)態(tài)代理的方法總結(jié)

    這篇文章主要介紹了java 動(dòng)態(tài)代理的方法總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡單的增刪改查功能案例詳解

    JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡單的增刪改查功能案例詳解

    這篇文章主要介紹了JavaWeb JDBC + MySql 通訊錄實(shí)現(xiàn)簡單的增刪改查功能,結(jié)合具體案例形式詳細(xì)分析了JavaWeb JDBC + MySql數(shù)據(jù)庫連接、增刪改查等相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2019-08-08
  • 詳解Java 中泛型的實(shí)現(xiàn)原理

    詳解Java 中泛型的實(shí)現(xiàn)原理

    這篇文章主要介紹了詳解Java 中泛型的實(shí)現(xiàn)原理,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • Java中的按值傳遞和按引用傳遞的代碼詳解

    Java中的按值傳遞和按引用傳遞的代碼詳解

    本文通過實(shí)例代碼給大家介紹了Java中的按值傳遞和按引用傳遞的相關(guān)知識(shí),感興趣的朋友跟隨腳本之家小編一起學(xué)習(xí)吧
    2018-06-06

最新評(píng)論