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

39

我确定之前已经以不同的方式提出了类似的问题——因为isEmptyOrNull非常常见,但人们实现方法不同。但是我有一个好奇的疑问,关于最佳可用方法,既要考虑内存又要考虑性能。

1)以下代码无法处理所有空格,例如空XML标记中的空格。

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

2) 虽然下面的代码很安全,但trim函数可能会影响性能和内存。

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

3)将一和二相结合可以节省一些性能和内存(如Chris在评论中建议的)

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) 或其他选项?


inputString!=null && inputString.isEmpty(); 更精细的写法是 inputString!=null && inputString.trim().isEmpty(); - StackFlowed
isEmpty 在 Java 6 中是“新功能”,而旧版本的实现或想保持 Java 5 兼容性的实现将不得不使用长度检查。 - zapl
2
如果你这样写 return inputString==null || inputString.length()==0 || inputString.trim().length()==0; (将1和2合并),那么trim只会在非零长度的字符串上调用。你也可以加上3。 - Christian Fries
@ChristianFries 是的,我同意-针对trim()和pattern matcher使用相同的方法。但是让我这样问吧,trim()或matcher(),哪一个更昂贵? - prash
1
Guava提供了Strings.isNullOrEmpty()方法,目前我正在大量使用它! - prash
显示剩余2条评论
14个回答

1

简单明了:

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

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


从技术上讲,这是一个很好的答案,但在性能方面可能不是最佳选择。 - prash
看起来像是竞争))) 谁能实现更长时间! - 4ndrew

0

你可以使用Optional和Apache commons Stringutils库

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

这里将检查string1是否不为空,如果为空,则返回string2


0
我们可以利用以下内容。
Optional.ofNullable(result).filter(res -> StringUtils.isNotEmpty(res))
            .ifPresent( s-> val.set(s));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接