我正在尝试检查一个Java String是否不是null
,不是空的,也不是空白的。
在我看来,这段代码应该非常适合这项工作。
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
根据文档,String.trim()
应该是这样工作的:
返回字符串的副本,省略了前导空格和尾随空格。
如果此String
对象表示空字符序列,或者此String
对象表示的字符序列的第一个和最后一个字符的代码都大于'\u0020'
(空格字符),则返回对此String
对象的引用。
但是,apache/commons/lang/StringUtils.java
的做法略有不同。
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
根据Java判断指定的字符是否为空格。当且仅当字符满足以下条件之一时,该字符才是Java空格字符:
SPACE_SEPARATOR
、LINE_SEPARATOR
或PARAGRAPH_SEPARATOR
),但也不是不间断的空格('\u00A0'
、'\u2007'
、'\u202F'
).'\t'
,水平TABULATION.'\n'
、U+000A换行符。'\u000B'
,U+000B垂直空格是'\f'
,U+000C换行符。<代码>H234<代码>H135它是D36,U+000D回车。'\u001D'
,组SEPARATOR.'\u001E'
,记录U+001C SEPARATOR.'\u001F'
,单元分隔符为U+001F。如果我没有弄错--或者可能是我没有正确地阅读它-- String.trim()
应该去掉Character.isWhiteSpace()
正在检查的任何字符。它们看起来都在'\u0020'
之上。
在本例中,较简单的isEmpty
函数似乎涵盖了较长的isBlank
所涵盖的所有场景。
在测试case?
isEmpty
和isBlank
的行为有所不同?没有,是否还有其他考虑因素,因此我应该选择isBlank
而不使用isEmpty
对于那些对实际运行测试感兴趣的人,这里有一些方法和单元测试。
public class StringUtil {
public static boolean isEmpty(String s) {
if ((s != null) && (s.trim().length() > 0))
return false;
else
return true;
}
public static boolean isBlank(String str) {
int strLen;
if (str == null || (strLen = str.length()) == 0) {
return true;
}
for (int i = 0; i < strLen; i++) {
if ((Character.isWhitespace(str.charAt(i)) == false)) {
return false;
}
}
return true;
}
}
和单元测试
@Test
public void test() {
String s = null;
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = "";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s));
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " ";
assertTrue(StringUtil.isEmpty(s)) ;
assertTrue(StringUtil.isBlank(s)) ;
s = " a ";
assertTrue(StringUtil.isEmpty(s)==false) ;
assertTrue(StringUtil.isBlank(s)==false) ;
}
更新:这是一个非常有趣的讨论-这就是为什么我喜欢Stack Overflow和这里的人们。顺便说一句,回到问题上,我们得到:
isBlank()
的一个与性能相关的原因。感谢@nhahtdh对@devconsole.发布于 2013-05-06 16:27:21
两种标准方法的目的是区分这两种情况:
org.apache.common.lang.StringUtils.isBlank(" ")
(将返回true)。
org.apache.common.lang.StringUtils.isEmpty(" ")
(将返回false)。
您的自定义isEmpty()
实现将返回true。
更新:
org.apache.common.lang.StringUtils.isEmpty()
用于确定字符串的长度是否为0,或者使用null.org.apache.common.lang.StringUtils.isBlank()
使其前进一步。它不仅检查字符串的长度是0还是null,还检查它是否只是一个空格字符串。在本例中,您将修剪isEmpty
方法中的字符串。现在唯一能发生的区别是不能发生的(你赋予它" "
),因为你正在删除它(删除尾随的空格-在本例中就像删除所有的空格)。
发布于 2013-05-06 16:33:40
我会选择isBlank()
而不是isEmpty()
,因为trim()
创建了一个新的String对象,以后必须对该对象进行垃圾回收。另一方面,isBlank()
不创建任何对象。
发布于 2013-05-06 16:38:24
您可以查看JSR303Bean Validtion,其中包含Annotatinos、@NotEmpty
和@NotNull
。Bean验证很酷,因为您可以将验证问题与方法的原始意图分开。
https://stackoverflow.com/questions/16394787
复制相似问题