相信寫過代碼的朋友們都會進行一個非空判斷,但是各種非空判斷中,那種才是最優雅,最高效的呢?
字符串類型
- 常用方法
方法1:if(s == null || s == ""){邏輯…}
方法2:if(s == null || s.equals("")){邏輯…}
方法3:if(s == null || s.length() == 0){邏輯…}
Tip:如果要用equal方法來判斷值,請用object<不可能為空/確定的值>.equal(object<可能為空/可變的值>))
- String類方法
public boolean isEmpty() {
return value.length == 0;
}
String類自帶的方法。其中的邏輯就是判斷字符串的長度來判斷字符串是否為空。
3. 工具類
StringUtils是一個工具欄,使用這個工具類需要導入以下依賴
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.11</version>
</dependency>
- isNotEmpty
public static boolean isEmpty(final CharSequence cs) {
return cs == null || cs.length() == 0;
}
public static boolean isNotEmpty(final CharSequence cs) {
return !isEmpty(cs);
}
isNotEmpty的方法就是isEmpty取非,isEmpty就是判斷是否為null和字符串的長度來判斷字符串是否為空。
- isBlank
public static boolean isBlank(final CharSequence cs) {
final int strLen = length(cs);
if (strLen == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if (!Character.isWhitespace(cs.charAt(i))) {
return false;
}
}
return true;
}
public static int length(final CharSequence cs) {
return cs == null ? 0 : cs.length();
}
public static boolean isNotBlank(final CharSequence cs) {
return !isBlank(cs);
}
isNotBlank的方法就是isBlank取非,isBlank就是判斷是否為null和字符串的長度來判斷字符串是否為空。在此基礎上又判斷了字符串中的每個字符是不是空格。
字符串判斷的最優解
先說結論,如果需求中帶僅有空格的字符串等同於空字符串,使用StringUtils工具欄的isBlank方法。如果需求中帶僅有空格的字符串不等同於空字符串,使用StringUtils工具欄的isEmpty方法。
- isEmpty最大的問題就是不能判斷null,所以失去了判空的意義。pass
- 網上有言論equal或者==的判斷沒有長度=0的判斷效率高,具體什么原因筆者沒有找到肯定的解答。但是從源碼中都使用長度來判斷這一現象也可以得到一定的印證。pass
- StringUtils工具欄的isEmpty和if(s == null || s.length() == 0){邏輯…}的缺點就是在於無法判斷空格。但是在實際開發中一個空格的字符串也應該是數據空的。所以最后的抉擇應該是看需求了。
集合類型
- 常用方法
方法1:if(arr == null || arr.size() == 0){邏輯…}
- 工具類
CollectionUtils是一個工具欄,使用這個工具類需要導入以下依賴
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
- isEmpty
public static boolean isEmpty(final Collection<?> coll) {
return coll == null || coll.isEmpty();
}
其中isEmpty()是接口Collection的一個方法。根據不同的數據類型,會有不同的實現,我們打開ArrayList類的實現。
發現其實就是一個長度的測試
public boolean isEmpty() {
return size == 0;
}
集合判斷的最優解
先說結論,毫無懸念的就是CollectionUtils工具欄的isEmpty的方法。
常用數據類型
Java中常用的數據類型有int、long、short、double、float 、byte、char、boolean。其中每一個都有其對應的初始值,分別是0、0、0、0.0、0.0、0、(空格)、false。所以這八種數據類型不會為空,只會在邏輯意義上沒有值,所以需要判斷是否賦值的話,就可以直接對初始值進行等值判斷。
值得注意的是,這八個基本數據類型在java中都有對應的包裝,而包裝類是可以為空的,判斷方法非常簡單。與null進行等值判斷即可。
類判斷
像Date,包裝類這種封裝類,直接與null進行等值判斷即可。如果是自定義的Pojo,在判斷對象是否為空的同時,可能還需要判斷里面的屬性,屬性的判斷就根據其屬性的類型,進行相應的判斷。
Optional類
Optional類是Java1.8的新特性,主要就是為了判斷可能類型是否為空的。如果想要了解,可以看下筆者下面這篇文章。
JDK8新特性——Optional