我有一个班级
class A{
String name
String address
}
def a = new A()
a.address = "some address"
println "${a.name} ${a.address}" => "null some address"
此处a.name
为空,因此打印的字符串将包含“null”,但我希望结果为"some address"
,忽略空值。
我知道我可以在打印时使用println "${a.name ?: ''} ${a.address ?: ''}"
,是否有更简单的解决方案?
答案 0 :(得分:11)
您可以为Groovy的toString
对象重新定义null
方法,以返回空字符串而不是null
。
def a = [a:null, b:'foobar']
println "${a.a} ${a.b}"
org.codehaus.groovy.runtime.NullObject.metaClass.toString = {return ''}
println "${a.a} ${a.b}"
这将打印:
null foobar
foobar
如果您只想暂时重新定义toString
,请在上一次print...
之后添加以下内容进行更改:
org.codehaus.groovy.runtime.NullObject.metaClass.toString = {return 'null'}
您还可以使用Groovy null
[1] [2]更改toString
的{{1}}行为。例如:
Category
答案 1 :(得分:8)
您可以在类中实现toString
方法,如下所示:
class A{
String name
String address
String toString() {
"${name ?: ''} ${address ?: ''}".trim()
}
}
然后做
def a = new A( address:'some address' )
println a
要打印出some address
,但这仍然使用了您在问题中使用的Elvis操作符...
不确定你能做的更简单......
答案 2 :(得分:3)
不确定是否更简单,但是:
[a.name, a.address].findAll().join(' ')
你当然可以将它与Tim的toString suggestion结合起来。
请注意,如果任何值可能是“falsy”(例如0),它将过滤掉它。你可以解决这个问题:
[a.name, a.address].findAll {it != null}.join(' ')