首頁 > Java > java教程 > 主體

Java怎麼實現判空

王林
發布: 2023-05-13 16:34:06
轉載
1076 人瀏覽過

    1、前言

    我們會有很多地方需要判空校驗,如果不做判空校驗則可能產生NullPointerException異常。

    先來看看實際專案中一些判空方式

    Java怎麼實現判空

    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是兩回事,公司也有實習生常常有把這兩個混淆的情況,list不等於null說明已經初始化了,堆內存中有一塊屬於它的地盤,而size為0說明還沒往裡面放東西,舉個例子說就是不等於null代表我現在有個瓶子,size大於0說明我往瓶子裡裝水了。

    實際專案中也發現有直接用list.isEmpty()去判斷的,來看一下原始碼:

    public boolean isEmpty() {
        return size == 0;
    }
    登入後複製

    相當於判斷瓶子裡有沒有水(前提是瓶子已經存在,若瓶子不存在,則會拋出NullPointerException異常)。

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

    3、String的判空

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

    Java怎麼實現判空

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

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

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

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

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

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

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

    #當然也可以使用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的出現就是用來防止NullpointException的。常見的方法有:

    • .empty():建立一個空的Optional實例

    • .of(T t) : 建立一個Optional實例,為null時報異常

    • .ofNullable(T t):若t 不為null,建立Optional 實例,否則建立空實例

    • isPresent() : 判斷容器中是否有值

    • ifPresent(Consume lambda) :容器若不為空則執行括號中的Lambda表達式

    • #orElse(T t) : 取得容器中的元素,若容器為空則傳回括號中的預設值

    • orElseGet(Supplier s) :如果呼叫物件包含值,傳回該值,否則傳回s 取得的值

    • orElseThrow() :如果為空,就拋出定義的例外狀況,如果不為空傳回目前物件

    • #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();
    }
    登入後複製

    當使用Optional時,一行搞定,非常的優雅。

    boolean blind = Optional.ofNullable(baseInfo.getBlind()).orElse( other: false);
    登入後複製

    4.1 Optional物件的建立

    public final class Optional<T> {
        private static final Optional<?> EMPTY = new Optional<>();
        private final T value;
        //可以看到两个构造方格都是private 私有的
        //说明 没办法在外面new出来Optional对象
        private Optional() {
            this.value = null;
        }
        private Optional(T value) {
            this.value = Objects.requireNonNull(value);
        }
        //这个静态方法大致 是创建出一个包装值为空的一个对象因为没有任何参数赋值
        public static<T> Optional<T> empty() {
            @SuppressWarnings("unchecked")
            Optional<T> t = (Optional<T>) EMPTY;
            return t;
        }
        //这个静态方法大致 是创建出一个包装值非空的一个对象 因为做了赋值
        public static <T> Optional<T> of(T value) {
            return new Optional<>(value);
        }
        //这个静态方法大致是 如果参数value为空,则创建空对象,如果不为空,则创建有参对象
        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 和函數式編程,一行搞定

    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()));
    登入後複製

    以上是Java怎麼實現判空的詳細內容。更多資訊請關注PHP中文網其他相關文章!

    相關標籤:
    來源:yisu.com
    本網站聲明
    本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
    熱門教學
    更多>
    最新下載
    更多>
    網站特效
    網站源碼
    網站素材
    前端模板
    關於我們 免責聲明 Sitemap
    PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!