<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          代碼優(yōu)雅之道——Java如何判空

          共 5183字,需瀏覽 11分鐘

           ·

          2024-03-29 12:30

              

          胖虎和朋友原創(chuàng)的視頻教程有興趣的可以看看


          (文末附課程大綱)


          ??2024 最新,Java成神之路,架構(gòu)視頻(點擊查看)


          ??超全技術(shù)棧的Java入門+進階+實戰(zhàn)!(點擊查看)

          來源:juejin.cn/post/7224027867084292154


          • 1 前言
          • 2 List的判空
          • 3 String的判空
          • 4 Optional
            • 4.1 Optional對象的創(chuàng)建
            • 4.2 使用場景
          • 5 總結(jié)

          1 前言

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

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

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

          627c529772496ab7c2bb0408836fc2af.webp

          圖片

          0cef93c48ab37c324c5788a157591570.webp

          圖片

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

          2 List的判空

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

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

          d39055502e13b17cdb6119bab10610b7.webp

          圖片

          相當于判斷瓶子里有沒有水(前提是瓶子已經(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。

          5d831cfd7393ccbc72e7fa41a91d5ea6.webp

          圖片

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

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

                
                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的出現(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(): 如果為空,就拋出定義的異常,如果不為空返回當前對象
          • map(Function f): 如果有值對其處理,并返回處理后的Optional,否則返回Optional.empty()
          • flatMap(Function mapper): 與map 類似,要求返回值必須是Optional
          • T get() 獲取容器中的元素,若容器為空則拋出NoSuchElement異常

          先看個常見的示例:

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

          57e947add8c449c834e0c7973efa4440.webp

          圖片

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

          b001eb552859a9c84ff036fac81068b5.webp

          圖片

          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層中 查詢一個對象,返回之后判斷是否為空并做處理

          1aeba32f8130224182ea86298839400b.webp

          圖片

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

          321dbc893ad748a6f73019ba33a43352.webp

          圖片

          5 總結(jié)

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

                


                  
                    
                          

          胖虎聯(lián)合兩位大佬朋友,一位是知名培訓機構(gòu)講師和科大訊飛架構(gòu),聯(lián)合打造了 《Java架構(gòu)師成長之路》 的視頻教程。完全對標外面2萬左右的培訓課程。

          除了基本的視頻教程之外,還提供了超詳細的課堂筆記,以及源碼等資料包..


          課程階段:

          1. Java核心 提升閱讀源碼的內(nèi)功心法
          2. 深入講解企業(yè)開發(fā)必備技術(shù)棧,夯實基礎(chǔ),為跳槽加薪增加籌碼
          3. 分布式架構(gòu)設(shè)計方法論。為學習分布式微服務(wù)做鋪墊
          4. 學習NetFilx公司產(chǎn)品,如Eureka、Hystrix、Zuul、Feign、Ribbon等,以及學習Spring Cloud Alibabba體系
          5. 微服務(wù)架構(gòu)下的性能優(yōu)化
          6. 中間件源碼剖析
          7. 元原生以及虛擬化技術(shù)
          8. 從0開始,項目實戰(zhàn) SpringCloud Alibaba電商項目

          點擊下方超鏈接查看詳情 d6939769b161f2cdd775fc00de6791a5.webpd6939769b161f2cdd775fc00de6791a5.webpd6939769b161f2cdd775fc00de6791a5.webp(或者點擊文末閱讀原文):

          (點擊查看)  2024年,最新Java架構(gòu)師成長之路 視頻教程!

          以下是課程大綱,大家可以雙擊打開原圖查看

          a653170d40fe23a658dafd733fdef701.webp


          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  午夜性爱av | 亚洲第一色网站 | 国产一级a毛一级a看免费视频乱 | 中文字幕亚洲第一 | 欧美操逼系列 |