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

问题描述 投票:23回答:11

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

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

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

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

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

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

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

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

4)还有其他吗?

java regex string trim is-empty
11个回答
24
投票

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)


0
投票

您可以使用Optional和Apache commons Stringutils库

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

这里它将检查string1是否为空并且不为空,否则它将返回string2


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")

0
投票

如果必须在同一验证中测试多个字符串,则可以执行以下操作:

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")


17
投票

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

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)){...}


15
投票

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

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

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


8
投票

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

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'
}

2
投票

Apache Commons Lang有StringUtils.isEmpty(String str)方法,如果参数为空或null,则返回true


2
投票
Optional.ofNullable(label)
.map(String::trim)
.map(string -> !label.isEmpty)
.orElse(false)

要么

TextUtils.isNotBlank(label);

最后一个解决方案将检查是否为null并同时修剪str


1
投票

在大多数情况下,来自apache commons库的StringUtils.isBlank(str)会解决它。但是,如果存在大小写,其中检查的输入字符串在引号内具有空值,则无法检查此类情况。

举个例子,我有一个使用String.valueOf(obj) API转换成字符串的输入对象。如果obj引用为null,则String.valueOf返回“null”而不是null。

当您尝试使用StringUtils.isBlank("null"),API失败时,您可能必须检查此类用例以确保您的验证正确。


0
投票

Simply and clearly:

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

0
投票

springframework library检查给定的String是否为空。

f(StringUtils.isEmpty("")) {
    //.... String is blank or null
}
© www.soinside.com 2019 - 2024. All rights reserved.