验证字符串为空或为空的最佳方法
问题内容:
我敢肯定,以前必须以不同的方式询问过这个问题-
因为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")