在Groovy中,如何确定一个字符串既不为空也不仅包含空格?

174

Groovy为字符串添加了isAllWhitespace()方法,这很不错,但似乎没有一个好的方法来确定一个字符串中除了空格之外是否还有其他内容。

我能想到的最好的方法是:

myString && !myString.allWhitespace

但这看起来太啰嗦了。验证似乎是一种常见的事情,必须有更简单的方法来确定这一点。

4个回答

337

4
myString?.trim() 返回一个字符串(可以是 null 或空字符串),而不是返回问题中的布尔值。 我猜这取决于你如何使用输出结果,如果只是用于 'if' 判断,那么这样做是可以的。 - Steven
17
或者boolean containsData = myString?.trim(): 该行代码是一个Java的空值安全操作符,用于判断字符串变量myString是否为空。如果myString不为空,则调用trim()方法去掉字符串两端的空格并将结果赋给布尔类型变量containsData。如果myString为空,则containsData变量将被赋予空值。 - tim_yates
8
@Steven,Groovy 语言中的真值表明空值或空字符串为假,因此如果您需要在不本身返回布尔值的语句中使用它,只需使用 () 将其括起来即可。例如,def myVal = (myString?.trim()) - cdeszaq
13
如果你执行 def myVal = (myString?.trim()),那么 myVal 的值要么是一个字符串 (String),要么是 null。用括号包裹它并不会将其转换成布尔值。但是,如果你将它赋值给一个布尔变量,或者使用 (myString?.trim()) as boolean,或者(如我的回答中所示)在 if 语句中使用它,那么就会使用该字符串(或 null)的 Groovy 真值。 - tim_yates
6
如果("false"),则打印“that's true too”。 - tim_yates
显示剩余4条评论

10
你可以添加一个String的方法来使它更加语义化:
String.metaClass.getNotBlank = { !delegate.allWhitespace }

它让你可以执行以下操作:

groovy:000> foo = ''
===> 
groovy:000> foo.notBlank
===> false
groovy:000> foo = 'foo'
===> foo
groovy:000> foo.notBlank
===> true

3
最佳的metaClass修改位置应该在哪里? - cdeszaq
如果 foo = null 呢? - Bertl
@Bertl 这将是一个空指针异常。但如果 foo 是 null,它就没有类,也不会有 metaClass 方法。 - doelleri
你的代码使用了双重否定,使得代码难以理解。最好使用类似isBlank的方式来做。 - stricq
你的代码使用了双重否定,使得代码难以理解。最好使用类似于isBlank这样的方式。 - stricq
请不要为这么简单的方法做出这样的事情,除非绝对有必要,没有人喜欢在与您的代码库特定的类上使用随机方法。至少,在这种情况下,将其命名为getNotAllWhiteSpace(),以便将其与底层实现联系起来,因为您只是有效地重命名和反转了一个已经存在的方法。最好一开始就直接使用!foo.allWhitespace,这并不难。 - Michael Peterson

4

它在我的grails2.1项目中有效:

String str = someObj.getSomeStr()?.trim() ?: "Default value"

如果 someObj.getSomeStr() 是 null 或者空字符串 "" -> str = "默认值"
如果 someObj.getSomeStr() 等于 "someValue" -> str = "someValue"

2
我发现这种方法快速且多功能:
static boolean isNullOrEmpty(String str) { return (str == null || str.allWhitespace) } 

// Then I often use it in this manner
DEF_LOG_PATH = '/my/default/path'
logPath = isNullOrEmpty(log_path) ? DEF_LOG_PATH : log_path

我对使用Groovy还比较新,不过我不确定是否存在一种将其作为String类型的实际扩展方法的方式,而且这种方法已经足够好用,所以我没有费心去寻找。

谢谢, -MH


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