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

Java中?!=null?的判斷

 更新時(shí)間:2025年02月10日 09:39:10   作者:HOLLING  
空指針異常是出現(xiàn)頻率比較高的bug,在出現(xiàn)空指針時(shí),很多小伙伴都是習(xí)慣性地加一個(gè)?!=null?的判斷,本文就來介紹一下如何使用,給感興趣的可以了解下

空指針異常是出現(xiàn)頻率比較高的bug,在出現(xiàn)空指針時(shí),很多小伙伴都是習(xí)慣性地加一個(gè) !=null 的判斷,這個(gè)bug就解決了。

當(dāng)代碼中頻繁出現(xiàn) !=null 的判斷時(shí),我們就會(huì)很頭疼,能不能高效、優(yōu)雅地做這個(gè)判斷?

答案當(dāng)然是可以的。

第一步 ,當(dāng)我們要做 !=null 的判斷時(shí),請(qǐng)停頓一下,看一下我們要做判斷的這個(gè)數(shù)據(jù)是什么類型?

數(shù)據(jù)類型無非就是String字符串、Object/自定義對(duì)象、List集合、Array數(shù)組、Map集合等類型。

第二步 ,思考這個(gè)數(shù)據(jù)類型對(duì)應(yīng)的工具類有哪些?

String類型,對(duì)應(yīng)的工具類有StringUtils。

Object對(duì)象,對(duì)應(yīng)的工具類有ObjectUtils。

Array數(shù)組,對(duì)應(yīng)的工具類有Arrays。

List集合、Map集合對(duì)應(yīng)的工具類有Collections、CollectionUtils等。

這些工具類都是Java、Spring框架自帶的工具類。

第三步 ,使用對(duì)應(yīng)類型的工具類做判斷。

1、如果這個(gè)數(shù)據(jù)是String類型時(shí),請(qǐng)使用StringUtils工具類。

String str = "";
StringUtils.isEmpty(str);  // true

StringUtils工具類比較有針對(duì)性,是針對(duì)String字符串的工具類。

public static boolean isEmpty(@Nullable Object str) {
   return str == null || "".equals(str);
}

在isEmpty方法中,既有為null的判斷,也有是否等于空字符串的判斷。

2、如果這個(gè)數(shù)據(jù)是Object類型,請(qǐng)使用ObjectUtils工具類。

Object obj = null;
ObjectUtils.isEmpty(obj); // true

3、如果這個(gè)數(shù)據(jù)是Map類型,也可以使用ObjectUtils工具類。

Map<String,Object> map = Collections.emptyMap();
ObjectUtils.isEmpty(map);// true

4、如果這個(gè)數(shù)據(jù)是List類型,還可以使用ObjectUtils工具類。

List<Integer> list =Collections.EMPTY_LIST;
ObjectUtils.isEmpty(list); // true

5、如果這個(gè)數(shù)據(jù)是數(shù)組類型,依舊可以使用ObjectUtils工具類。

// 數(shù)組
Object[] objArr = null;
ObjectUtils.isEmpty(objArr); // true

ObjectUtils 中的isEmpty()這一個(gè)方法,分別可以對(duì)字符串、數(shù)組、Map集合、List集合進(jìn)行是否等于null的判斷。

這個(gè)isEmpty方法為什么能判斷這么多種數(shù)據(jù)類型呢?一起看下它的源碼。

public static boolean isEmpty(@Nullable Object obj) {
    // 判斷obj是否為null,如果是直接f
    if (obj == null) {
      return true;
    }
    // 判斷obj是否是Optional的子類
    if (obj instanceof Optional) {
      // 如果是,則調(diào)用isPresent方法判斷是否為null
      return !((Optional) obj).isPresent();
    }
    // 判斷obj是否是CharSequence的子類
    if (obj instanceof CharSequence) {
      // 如果是,則獲取長(zhǎng)度,長(zhǎng)度等于0時(shí),就認(rèn)為這個(gè)obj是空字符串
      return ((CharSequence) obj).length() == 0;
    }
    // 判斷obj是否為數(shù)組
    if (obj.getClass().isArray()) {
      // 數(shù)組的長(zhǎng)度等于0就認(rèn)為這個(gè)數(shù)組是空數(shù)組
      return Array.getLength(obj) == 0;
    }
    // 判斷obj是否為Collection集合的子類
    if (obj instanceof Collection) {
      // 用Collection子類的isEmpty方法判斷集合是否為空
      return ((Collection) obj).isEmpty();
    }
    // 判斷obj是否為Map接口的子類
    if (obj instanceof Map) {
      // 如果是,則進(jìn)行強(qiáng)轉(zhuǎn),并用子類的isEmpty方法判斷集合是否為空
      return ((Map) obj).isEmpty();
    }

    // else
    return false;
}

在這個(gè)靜態(tài)方法中,首先對(duì)傳入的obj對(duì)象進(jìn)行是否等于null的判斷,如果是則返回。如果不是null,對(duì)obj進(jìn)行數(shù)據(jù)類型進(jìn)行定位,然后根據(jù)數(shù)據(jù)類型進(jìn)行判斷。

在這個(gè)方法中,封裝了Optional、CharSequence、Array、Collection、Map數(shù)據(jù)類型,幾乎涵蓋所有的數(shù)據(jù)類型。

通過這段源碼,我們也可以看出,它對(duì)復(fù)雜類型的集合的判斷存在一些缺陷。也就是說它只判斷了集合的長(zhǎng)度,集合的長(zhǎng)度為0,就認(rèn)為集合是空的。

// 創(chuàng)建一個(gè)只有一個(gè)元素的List集合
List<Integer> list = Collections.singletonList(null);
ObjectUtils.isEmpty(list); // false

上面的這段代碼,我們創(chuàng)建了一個(gè)只有一個(gè)元素、且這個(gè)元素為null的List集合。

如果是對(duì)象數(shù)組,數(shù)組里有一個(gè)對(duì)象,但這一個(gè)對(duì)象為null,這個(gè)判斷就失靈了。

ObjectUtils 類中對(duì)對(duì)象數(shù)組的判斷是另外一個(gè)isEmpty方法。

public static boolean isEmpty(@Nullable Object[] array) {
return array == null || array.length == 0;
}

因此在這2種情況下,我們?cè)偈褂肙bjectUtils的isEmpty方法就不合適了,我們需要對(duì)集合或數(shù)組里的每一個(gè)元素進(jìn)行判斷是否為null。

6、針對(duì)List集合中元素是否為空的正確判斷

Arrays.stream(list.toArray()).allMatch(ObjectUtils::isEmptyisNull);

這里用到了Arrays工具類。需要先把List集合轉(zhuǎn)換成數(shù)組,然后再使用Arrays工具類對(duì)數(shù)組里的元素逐一判斷是否為null。

7、針對(duì)Map集合是否為空為null的判斷

Map<String,Object> map = Collections.emptyMap();
CollectionUtils.isEmpty(map);

CollectionUtils工具類中isEmpty判斷方法源碼:

public static boolean isEmpty(@Nullable Map<?, ?> map) {
    return map == null || map.isEmpty();
}

map是否等于null,map集合是否為空,這一個(gè)方法中聚合了兩個(gè)判斷。我們直接調(diào)用它就可以減少我們的工作量。

除此之外,CollectionUtils工具類中還有針對(duì)List集合的isEmpty方法:

List<Integer> list = null;
// 使用CollectionUtils工具類判斷l(xiāng)ist集合是否為空
CollectionUtils.isEmpty(list); // true

針對(duì)List集合的isEmpty源碼:

public static boolean isEmpty(@Nullable Collection<?> collection) {
    return collection == null || collection.isEmpty();
}

在這個(gè)方法中,既有為null的判斷,也有isEmpty的判斷,聚合了兩個(gè)判斷,我們直接調(diào)用它也可以減少我們的工作量。

最后總結(jié)一下

判斷一個(gè)數(shù)據(jù)是否為null,可以經(jīng)過三步,第一步思考屬于什么數(shù)據(jù)類型,第二步根據(jù)數(shù)據(jù)類型選擇正確的工具類,第三步,使用正確的工具類進(jìn)行判斷。

針對(duì)String字符串類型的數(shù)據(jù),直接使用StringUtils工具類。

針對(duì)除了String之外的數(shù)據(jù)類型都可以使用ObjectUtils工具類。

針對(duì)List集合、Map集合,除了ObjectUtils還可以使用CollectionUtils工具類進(jìn)行判斷。

針對(duì)數(shù)組和List集合中的子元素是否都為null的判斷,則需要遍歷判斷。

到此這篇關(guān)于Java中 !=null 的判斷的文章就介紹到這了,更多相關(guān)https://blog.csdn.net/qq_37844084/article/details/144914147內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java實(shí)現(xiàn)抖音代碼舞源碼

    java實(shí)現(xiàn)抖音代碼舞源碼

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)抖音代碼舞的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-04-04
  • Java 數(shù)組高頻考點(diǎn)分析講解

    Java 數(shù)組高頻考點(diǎn)分析講解

    數(shù)組對(duì)于每一門編程語言來說都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java 語言中提供的數(shù)組是用來存儲(chǔ)固定大小的同類型元素
    2022-04-04
  • SpringBoot監(jiān)聽Redis key失效事件的實(shí)現(xiàn)代碼

    SpringBoot監(jiān)聽Redis key失效事件的實(shí)現(xiàn)代碼

    這篇文章給大家介紹了SpringBoot實(shí)現(xiàn)監(jiān)聽Redis key失效事件的方法,文中通過代碼示例給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-02-02
  • java文件讀寫工具類分享

    java文件讀寫工具類分享

    這篇文章主要為大家詳細(xì)介紹了java文件讀寫工具類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解

    MyBatis中#{}?和?${}?的區(qū)別和動(dòng)態(tài)?SQL詳解

    這篇文章主要介紹了MyBatis中#{}和${}的區(qū)別,包括參數(shù)傳遞、安全性、性能等方面,然后詳細(xì)介紹了如何使用#{}和${}進(jìn)行排序、模糊查詢、動(dòng)態(tài)SQL、數(shù)據(jù)庫連接池等操作,最后,總結(jié)了注解方式的動(dòng)態(tài)SQL,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Spring Cloud Gateway自定義異常處理Exception Handler的方法小結(jié)

    Spring Cloud Gateway自定義異常處理Exception Handler的方法小結(jié)

    這篇文章主要介紹了Spring Cloud Gateway自定義異常處理Exception Handler的方法,本文通過兩種方法結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java JSqlParser解析,修改和生成SQL語句的實(shí)用技巧

    Java JSqlParser解析,修改和生成SQL語句的實(shí)用技巧

    JSQLParser 是一個(gè)強(qiáng)大的開源 Java 庫,用于解析 SQL 并提供語法樹操作功能,本文將詳細(xì)介紹如何使用 JSQLParser,并提供常見使用場(chǎng)景的代碼示例,希望對(duì)大家有所幫助
    2025-04-04
  • 基于Java實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測(cè)

    基于Java實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測(cè)

    這篇文章主要介紹了如何在?Java?中實(shí)現(xiàn)無向環(huán)和有向環(huán)的檢測(cè),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下
    2022-04-04
  • java bootclasspath的具體用法

    java bootclasspath的具體用法

    本文主要介紹了java bootclasspath的具體用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • SpringBoot整合DeepSeek實(shí)現(xiàn)AI對(duì)話功能

    SpringBoot整合DeepSeek實(shí)現(xiàn)AI對(duì)話功能

    本文介紹了如何在SpringBoot項(xiàng)目中整合DeepSeek API和本地私有化部署DeepSeekR1模型,通過SpringAI框架簡(jiǎn)化了人工智能模型的集成,感興趣的小伙伴跟著小編一起來看看吧
    2025-02-02

最新評(píng)論

沁阳市| 宁强县| 监利县| 南康市| 凌源市| 犍为县| 建德市| 毕节市| 大连市| 鄢陵县| 南阳市| 潜山县| 茶陵县| 报价| 东平县| 深圳市| 枣庄市| 铜川市| 永宁县| 交口县| 迁安市| 蛟河市| 通州市| 乌兰察布市| 保山市| 兴安县| 饶平县| 峡江县| 珲春市| 高邑县| 韶关市| 延边| 来宾市| 二连浩特市| 广平县| 绿春县| 尉犁县| 溆浦县| 岳池县| 寿宁县| 玛沁县|