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

一文教你掌握Java如何實現(xiàn)判空

 更新時間:2023年04月21日 09:00:42   作者:LoneWalker  
實際項目中我們會有很多地方需要判空校驗,如果不做判空校驗則可能產(chǎn)生NullPointerException異常。所以本文小編為大家整理了Java中幾個常見的判空方法,希望對大家有所幫助

1、前言

實際項目中我們會有很多地方需要判空校驗,如果不做判空校驗則可能產(chǎn)生NullPointerException異常。

針對異常的處理我們在上一篇有提及:

先來看一下實際項目中一些判空方式

if (ObjectUtil.isNotNull(vo.getSubmitterId())) {
    userIds.add(vo.getSubmitterId());
}
if (StringUtils.isNotBlank(vo.getBudgetPM())) {
    userIds.add(Long.valueOf(vo.getBudgetPM()));
}
if (CollUtil.isNotEmpty(vo.getOriginatorList())) {
    userIds.addAl1(vo.getOriginatorList().stream();
}

通常我們判斷一個對象是否為Null,可以使用java.util中的Objects.nonNull(obj)、hutool中的ObjectUtil或者直接 null != obj

2、List的判空

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

實際項目中也發(fā)現(xiàn)有直接用list.isEmpty()去判斷的,來看一下源碼:

public boolean isEmpty() {
    return size == 0;
}

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

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

3、String的判空

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

針對字符串判空有以下幾種方式:

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

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

StringUtils.isNotEmpty(a);

* StringUtils.isNotEmpty(null) = false

* StringUtils.isNotEmpty("") = false

* StringUtils.isNotEmpty(" ") = true

* StringUtils.isNotEmpty("bob") = true

* StringUtils.isNotEmpty(" bob ") = true

4、Optional

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

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

先看個常見的示例:

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

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

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

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

4.1 Optional對象的創(chuàng)建

public final class Optional<T> {
    private static final Optional<?> EMPTY = new Optional<>();
    private final T value;
    //可以看到兩個構(gòu)造方格都是private 私有的
    //說明 沒辦法在外面new出來Optional對象
    private Optional() {
        this.value = null;
    }
    private Optional(T value) {
        this.value = Objects.requireNonNull(value);
    }
    //這個靜態(tài)方法大致 是創(chuàng)建出一個包裝值為空的一個對象因為沒有任何參數(shù)賦值
    public static<T> Optional<T> empty() {
        @SuppressWarnings("unchecked")
        Optional<T> t = (Optional<T>) EMPTY;
        return t;
    }
    //這個靜態(tài)方法大致 是創(chuàng)建出一個包裝值非空的一個對象 因為做了賦值
    public static <T> Optional<T> of(T value) {
        return new Optional<>(value);
    }
    //這個靜態(tài)方法大致是 如果參數(shù)value為空,則創(chuàng)建空對象,如果不為空,則創(chuàng)建有參對象
    public static <T> Optional<T> ofNullable(T value) {
        return value == null ? empty() : of(value);
    }
}

4.2使用場景

場景1:在service層中 查詢一個對象,返回之后判斷是否為空并做處理

Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
Optional.ofNullable(task).orElseThrow(() -> new ProcessException(ErrorCodeEnum,SYSIEM ERROR));

場景2:使用Optional 和函數(shù)式編程,一行搞定

Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
Map<String,String> map = new HashMap<>( initialCapacity: 8);
Optional.ofNullable(task).ifPresent(d -> map.put("taskId",d.getTaskDefinitionKey()));

5、總結(jié)

每種方法的存在必然有適用的場景,有些情況下這種鏈?zhǔn)骄幊蹋m然代碼優(yōu)雅了。但是,邏輯性沒那么明顯,可讀性有所降低,大家項目中看情況酌情使用。

以上就是一文教你掌握Java如何實現(xiàn)判空的詳細內(nèi)容,更多關(guān)于Java判空的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)

    java-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)

    下面小編就為大家?guī)硪黄猨ava-servlet-轉(zhuǎn)發(fā)AND路徑(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java實現(xiàn)圖書借閱系統(tǒng)

    Java實現(xiàn)圖書借閱系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)圖書借閱系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • JVM Client和Server端有什么區(qū)別

    JVM Client和Server端有什么區(qū)別

    這篇文章主要介紹了JVM Client和Server端有什么區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-11-11
  • SpringBoot整合Druid實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密

    SpringBoot整合Druid實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密

    Druid連接池是阿里巴巴開源的數(shù)據(jù)庫連接池項目,Druid連接池為監(jiān)控而生,內(nèi)置強大的監(jiān)控功能,監(jiān)控特性不影響性能,本文給大家介紹了SpringBoot整合Druid實現(xiàn)SQL監(jiān)控和數(shù)據(jù)庫密碼加密,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下
    2024-06-06
  • JavaSE經(jīng)典小練習(xí)項目之拷貝文件夾

    JavaSE經(jīng)典小練習(xí)項目之拷貝文件夾

    文件拷貝是一個常見的任務(wù),無論是備份文件,還是將文件從一個位置復(fù)制到另一個位置,文件拷貝都是必不可少的,這篇文章主要給大家介紹了關(guān)于JavaSE經(jīng)典小練習(xí)項目之拷貝文件夾的相關(guān)資料,需要的朋友可以參考下
    2023-10-10
  • JAVA堆排序算法的講解

    JAVA堆排序算法的講解

    這篇文章主要介紹了JAVA堆排序算法的知識點,文中代碼非常詳細,配合上圖片講解,幫助大家更好的參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 關(guān)于activemq安裝配置以及啟動錯誤的解決

    關(guān)于activemq安裝配置以及啟動錯誤的解決

    這篇文章主要介紹了關(guān)于activemq安裝配置以及啟動錯誤的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Java中用Socket實現(xiàn)HTTP文件上傳實例

    Java中用Socket實現(xiàn)HTTP文件上傳實例

    本篇文章主要介紹了Java中用Socket實現(xiàn)HTTP文件上傳實例,詳細的介紹了通過讀取Socket的輸入流來實現(xiàn)一個文件上傳的功能,有興趣的同學(xué)可以一起了解一下
    2017-04-04
  • Java對象數(shù)組的添加、刪除和遍歷代碼示例

    Java對象數(shù)組的添加、刪除和遍歷代碼示例

    在Java編程中,我們經(jīng)常需要對數(shù)據(jù)結(jié)構(gòu)進行遍歷操作,并根據(jù)業(yè)務(wù)需求刪除部分元素,這篇文章主要給大家介紹了關(guān)于Java對象數(shù)組的添加、刪除和遍歷的相關(guān)資料,需要的朋友可以參考下
    2024-04-04
  • SpringBoot自動初始化數(shù)據(jù)庫的方法分享

    SpringBoot自動初始化數(shù)據(jù)庫的方法分享

    我們在項目中應(yīng)該經(jīng)常遇到過初始化數(shù)據(jù)的場景,特別是項目部署或者交付的時候,那么有什么方式可以在項目啟動的時候自動初始化數(shù)據(jù)庫呢,下面小編就來和大家分享幾個方法吧
    2023-08-08

最新評論

仁寿县| 海口市| 珠海市| 江油市| 临安市| 孝昌县| 塘沽区| 娄底市| 临澧县| 凤凰县| 乐至县| 吴忠市| 泾阳县| 涡阳县| 兴业县| 绥宁县| 孟州市| 萨嘎县| 苗栗县| 松潘县| 唐河县| 讷河市| 全南县| 大同市| 搜索| 尼玛县| 白水县| 冷水江市| 郑州市| 历史| 红安县| 甘德县| 晋江市| 武川县| 吉隆县| 浪卡子县| 绥化市| 新巴尔虎右旗| 普兰店市| 诏安县| 治多县|