11

我有一堂课

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,所以打印的字符串将包含“null”,但是我希望结果是"some address"忽略 null 值。

我知道我可以println "${a.name ?: ''} ${a.address ?: ''}"在打印时使用,有没有更简单的解决方案?

4

4 回答 4

11

您可以重新定义toStringGroovynull对象的方法以返回空字符串而不是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 [1] [2]null更改的行为。例如:toStringCategory

@Category(org.codehaus.groovy.runtime.NullObject) class MyNullObjectCategory {def toString() {''}}
use (MyNullObjectCategory) {
    println "${a.a} ${a.b}"
}
于 2012-05-09T15:09:44.297 回答
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 运算符,就像您在问题中所说的那样......

不知道你可以做更简单的事情......

于 2012-05-09T14:13:13.297 回答
3

不确定是否更简单,但是:

[a.name, a.address].findAll().join(' ')

您当然可以将它与 Tim 的 toString建议结合使用。

请注意,如果任何值可能是“假的”(例如 0),它会将其过滤掉。你可以解决这个问题:

[a.name, a.address].findAll {it != null}.join(' ')
于 2012-05-09T14:34:06.800 回答
0

我认为,实现它的一种相当简单的方法,即删除 null,是连接字符串并使用替换方法。

myString=""
myString=myString + "Bla Bla"
myString.replace("null", '')
于 2021-12-27T07:33:48.303 回答