簡體   English   中英

驗證字符串為空或 null 的最佳方法

[英]Best way to verify string is empty or null

我相信這之前一定以不同的方式被問過——因為 isEmptyOrNull 是如此普遍,但人們以不同的方式實現它。 但我有以下關於最佳可用方法的好奇查詢,這對內存和性能都有好處。

1) 下面沒有像空 XML 標簽那樣考慮所有空格

return inputString==null || inputString.length()==0;

2)下面一個要小心但是trim可以吃一些性能+內存

return inputString==null || inputString.trim().length()==0;

3)結合一和二可以節省一些性能+內存(正如克里斯在評論中建議的那樣)

return inputString==null || inputString.trim().length()==0 || inputString.trim().length()==0;

4) 轉換為模式匹配器(僅在字符串非零長度時調用)

private static final Pattern p = Pattern.compile("\\s+");

return inputString==null || inputString.length()==0 || p.matcher(inputString).matches();

5) 使用像 - Apache Commons ( StringUtils.isBlank/isEmpty ) 或 Spring ( StringUtils.isEmpty ) 或 Guava ( Strings.isNullOrEmpty ) 或任何其他選項之類的庫?

來自 Apache Commons 的有用方法:

 org.apache.commons.lang.StringUtils.isBlank(String str)

https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/StringUtils.html#isBlank(java.lang.String)

要檢測字符串是否為 null 或為空,您可以使用以下內容,而無需在您的項目中包含任何外部依賴項,並且仍然保持您的代碼簡單/干凈:

if(myString==null || myString.isEmpty()){
    //do something
}

或者如果還需要檢測空格:

if(myString==null || myString.trim().isEmpty()){
    //do something
}

您可以輕松地將它們包裝到實用方法中以使其更加簡潔,因為這些是非常常見的檢查:

public final class StringUtils{

    private StringUtils() { }   

    public static bool isNullOrEmpty(string s){
        if(s==null || s.isEmpty()){
            return true;
        }
        return false;
    }

    public static bool isNullOrWhiteSpace(string s){
        if(s==null || s.trim().isEmpty()){
            return true;
        }
        return false;
    }
}

然后通過以下方式調用這些方法:

if(StringUtils.isNullOrEmpty(myString)){...}

if(StringUtils.isNullOrWhiteSpace(myString)){...}

只是為了表明 java 8 刪除空值的立場。

String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
    ...
}

如果您可以使用Optional<String>就有意義。

這個來自Google Guava 的可以同時檢查“空字符串和空字符串”。

Strings.isNullOrEmpty("Your string.");

使用 Maven 添加依賴項

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>20.0</version>
</dependency>

使用 Gradle

dependencies {
  compile 'com.google.guava:guava:20.0'
}

還沒有看到任何完全本機的解決方案,所以這里有一個:

return str == null || str.chars().allMatch(Character::isWhitespace);

基本上,使用原生 Character.isWhitespace() 函數。 從那里,您可以實現不同級別的優化,具體取決於它的重要性(我可以向您保證,在 99.99999% 的用例中,不需要進一步優化):

return str == null || str.length() == 0 || str.chars().allMatch(Character::isWhitespace);

或者,要真正優化(但真丑):

int len;
if (str == null || (len = str.length()) == 0) return true;
for (int i = 0; i < len; i++) {
  if (!Character.isWhitespace(str.charAt(i))) return false;
}
return true;

我喜歡做的一件事:

Optional<String> notBlank(String s) {
  return s == null || s.chars().allMatch(Character::isWhitepace))
    ? Optional.empty()
    : Optional.of(s);
}

...

notBlank(myStr).orElse("some default")

Apache Commons Lang 有StringUtils.isEmpty(String str)方法,如果參數為空或為空則返回 true

springframework庫 檢查給定的 String 是否為空。

f(StringUtils.isEmpty(str)) {
    //.... String is blank or null
}
Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)

或者

TextUtils.isNotBlank(label);

最后一個解決方案將檢查是否為空並同時修剪 str

在大多數情況下,來自 apache 公共庫的StringUtils.isBlank(str)可以解決它。 但是,如果存在被檢查的輸入字符串在引號內具有空值的情況,則無法檢查這種情況。

以我有一個使用String.valueOf(obj) API 轉換為字符串的輸入對象為例。 如果 obj 引用為 null,則 String.valueOf 返回“null”而不是 null。

當您嘗試使用StringUtils.isBlank("null") ,API 慘遭失敗,您可能還必須檢查此類用例以確保您的驗證正確。

使用 openJDK 11,您可以使用內部驗證來檢查字符串是否為空或只是空格

import jdk.internal.joptsimple.internal.Strings;
...

String targetString;
if (Strings.isNullOrEmpty(tragetString)) {}

簡單明了:

if (str == null || str.trim().length() == 0) {
    // str is empty
}

您可以使用 Optional 和 Apache commons Stringutils 庫

Optional.ofNullable(StringUtils.noEmpty(string1)).orElse(string2);

在這里它將檢查string1是否不為 null 且不為空,否則將返回string2

如果您必須在同一個驗證中測試多個字符串,您可以執行以下操作:

import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Stream;

public class StringHelper {

  public static Boolean hasBlank(String ... strings) {

    Predicate<String> isBlank = s -> s == null || s.trim().isEmpty();

    return Optional
      .ofNullable(strings)
      .map(Stream::of)
      .map(stream -> stream.anyMatch(isBlank))
      .orElse(false);
  }

}

因此,您可以像StringHelper.hasBlank("Hello", null, "", " ")StringHelper.hasBlank("Hello")以通用形式使用它。

我們可以利用以下

Optional.ofNullable(result).filter(res -> StringUtils.isNotEmpty(res))
            .ifPresent( s-> val.set(s));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM