1、前言
我們會有很多地方需要判空校驗,如果不做判空校驗則可能產生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是兩回事,公司也有實習生常常有把這兩個混淆的情況,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。
針對字串判空有以下幾種方式:
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中文網其他相關文章!

Javaremainsagoodlanguageduetoitscontinuousevolutionandrobustecosystem.1)Lambdaexpressionsenhancecodereadabilityandenablefunctionalprogramming.2)Streamsallowforefficientdataprocessing,particularlywithlargedatasets.3)ThemodularsystemintroducedinJava9im

Javaisgreatduetoitsplatformindependence,robustOOPsupport,extensivelibraries,andstrongcommunity.1)PlatformindependenceviaJVMallowscodetorunonvariousplatforms.2)OOPfeatureslikeencapsulation,inheritance,andpolymorphismenablemodularandscalablecode.3)Rich

Java的五大特色是多態性、Lambda表達式、StreamsAPI、泛型和異常處理。 1.多態性讓不同類的對象可以作為共同基類的對象使用。 2.Lambda表達式使代碼更簡潔,特別適合處理集合和流。 3.StreamsAPI高效處理大數據集,支持聲明式操作。 4.泛型提供類型安全和重用性,編譯時捕獲類型錯誤。 5.異常處理幫助優雅處理錯誤,編寫可靠軟件。

java'stopfeatureSnificallyenhanceItsperformanCandScalability.1)對象 - 方向clincipleslike-polymormormormormormormormormormormormorableableflexibleandscalablecode.2)garbageCollectionAutectionAutoctionAutoctionAutoctionAutoctionAutoctionAutoMenateMememorymanateMmanateMmanateMmanagementButCancausElatemention.3)

JVM的核心組件包括ClassLoader、RuntimeDataArea和ExecutionEngine。 1)ClassLoader負責加載、鏈接和初始化類和接口。 2)RuntimeDataArea包含MethodArea、Heap、Stack、PCRegister和NativeMethodStacks。 3)ExecutionEngine由Interpreter、JITCompiler和GarbageCollector組成,負責bytecode的執行和優化。

Java'ssafetyandsecurityarebolsteredby:1)strongtyping,whichpreventstype-relatederrors;2)automaticmemorymanagementviagarbagecollection,reducingmemory-relatedvulnerabilities;3)sandboxing,isolatingcodefromthesystem;and4)robustexceptionhandling,ensuringgr

Javaoffersseveralkeyfeaturesthatenhancecodingskills:1)對象 - 方向 - 方向上的allowslowsmodelowsmodelingreal-worldentities

thejvmisacrucialcomponentthatrunsjavacodebytranslatingitolachine特定結構,影響性能,安全性和便攜性。 1)theclassloaderloader,links andinitializesClasses.2)theexecutionEngineExecutionEngineExecutionEngineExecuteNexeCuteByteCuteByteCuteByTecuteByteCuteByteCuteBytecuteBytecuteByteCoDeinintolachineinstructionsions.3)Memo.3)Memo


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

禪工作室 13.0.1
強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

記事本++7.3.1
好用且免費的程式碼編輯器

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器