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


问题内容

我敢肯定,以前必须以不同的方式询问过这个问题-
因为isEmptyOrNull很常见,但人们以不同的方式实现它。但是我在最好的可用方法方面有以下好奇的查询,这对内存和性能都有好处。

1)下方不考虑所有空格,例如在XML标签为空的情况下

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

2)低于一保重但修剪会降低性能和记忆力

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)之类的库或其他任何选项?


问题答案:

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

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