在groovy中串联字符串时如何摆脱“null”?

时间:2012-05-09 14:08:19

标签: groovy

我有一个班级

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 ?: ''}",是否有更简单的解决方案?

3 个答案:

答案 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(' ')