验证字符串的最佳方法是空或null

pra*_*ash 26 java regex string trim is-empty

我确信之前必须以不同的方式提出这个问题 - 因为isEmptyOrNull是如此常见但人们以不同的方式实现它.但我对最佳可用方法有好奇的查询,这对于内存和性能都有好处.

1)下面没有考虑所有空格,例如空XML标记

return inputString==null || inputString.length()==0;
Run Code Online (Sandbox Code Playgroud)

2)下面一个小心,但修剪可以吃一些性能+记忆

return inputString==null || inputString.trim().length()==0;
Run Code Online (Sandbox Code Playgroud)

3)转换为模式匹配器(仅当字符串非零长度时调用)

return inputString==null || inputString.trim().length()==0 || inputString.trim().length()==0;
Run Code Online (Sandbox Code Playgroud)

4)还有其他吗?

小智 26

Apache Commons的有用方法:

 org.apache.commons.lang.StringUtils.isBlank(String str)
Run Code Online (Sandbox Code Playgroud)

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

  • Guava有Strings.isNullOrEmpty()这些天我经常使用它 (5认同)
  • isNullOrEmpty 不检查输入字符串由多个空格组成的情况 (2认同)

Gre*_*egH 18

要检测字符串是空还是空,您可以使用以下内容,而不在项目中包含任何外部依赖项,并且仍然保持代码简单/干净:

if(myString==null || myString.isEmpty()){
    //do something
}
Run Code Online (Sandbox Code Playgroud)

或者如果还需要检测空格:

if(myString==null || myString.trim().isEmpty()){
    //do something
}
Run Code Online (Sandbox Code Playgroud)

您可以轻松地将这些包装到实用程序方法中,以便更简洁,因为这些是非常常见的检查:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后通过以下方式调用这些方法

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

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


Joo*_*gen 15

只是为了显示java 8的立场来删除空值.

String s = Optional.ofNullable(myString).orElse("");
if (s.trim().isEmpty()) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果你可以使用,这是有道理的Optional<String>.

  • 不得不说,我认为Optional的使用就像是一场大病在感染Java社区。我以前从未见过需要如此多的额外输入才能实现的功能如此简单,但在竞争性语言寻求更简洁的解决方案时却被如此多的人采用。它一定会让非 Java 开发人员嘲笑我们。当 OptionalS 被每秒调用数百万次的方法实例化返回时,我什至没有提到额外的 CPU 和内存消耗 - 但它都在云中运行,所以 CPU 和内存几乎是免费的,对吧? (2认同)

mav*_*hen 8

来自Google Guava的这个可以在同一时间检出"null和空字符串".

Strings.isNullOrEmpty("Your string.");
Run Code Online (Sandbox Code Playgroud)

使用Maven添加依赖项

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>20.0</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

与Gradle

dependencies {
  compile 'com.google.guava:guava:20.0'
}
Run Code Online (Sandbox Code Playgroud)


gza*_*zak 4

还没有看到任何完全本机的解决方案,所以这里有一个:

return str == null || str.chars().allMatch(Character::isWhitespace);
Run Code Online (Sandbox Code Playgroud)

基本上,使用本机 Character.isWhitespace() 函数。从那里,您可以实现不同级别的优化,具体取决于其重要性(我可以向您保证,在 99.99999% 的用例中,不需要进一步优化):

return str == null || str.length() == 0 || str.chars().allMatch(Character::isWhitespace);
Run Code Online (Sandbox Code Playgroud)

或者,为了真正优化(但很难看):

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;
Run Code Online (Sandbox Code Playgroud)

我喜欢做的一件事:

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

...

notBlank(myStr).orElse("some default")
Run Code Online (Sandbox Code Playgroud)