溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java怎么實(shí)現(xiàn)判空

發(fā)布時(shí)間:2023-05-06 10:30:14 來(lái)源:億速云 閱讀:101 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇“Java怎么實(shí)現(xiàn)判空”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“Java怎么實(shí)現(xiàn)判空”文章吧。

    1、前言

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

    先來(lái)看一下實(shí)際項(xiàng)目中一些判空方式

    Java怎么實(shí)現(xiàn)判空

    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();
    }

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

    2、List的判空

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

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

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

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

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

    3、String的判空

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

    Java怎么實(shí)現(xiàn)判空

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

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

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

    2、比較字符串長(zhǎng)度,高效:

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

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

    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

    該工具類(lèi)中還有個(gè)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)就是用來(lái)防止NullpointException的。常見(jiàn)的方法有:

    • .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 類(lèi)似,要求返回值必須是Optional

    • T get() :獲取容器中的元素,若容器為空則拋出NoSuchElement異常

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

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

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

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

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

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

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

    4.2使用場(chǎng)景

    場(chǎng)景1:在service層中 查詢一個(gè)對(duì)象,返回之后判斷是否為空并做處理

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

    場(chǎng)景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()));

    以上就是關(guān)于“Java怎么實(shí)現(xiàn)判空”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問(wèn)一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI