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

don*_*ior 10 groovy

我上课了

class A{
    String name
    String address
}

def a = new A()
a.address = "some address"    
println "${a.name} ${a.address}"  => "null some address"
Run Code Online (Sandbox Code Playgroud)

这里a.name是null,所以打印的字符串将包含"null",但我希望结果是"some address"忽略null值.

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

Dan*_*ruz 11

您可以重新定义toStringGroovy 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}"
Run Code Online (Sandbox Code Playgroud)

这将打印:

null foobar
 foobar
Run Code Online (Sandbox Code Playgroud)

如果您只想toString暂时重新定义,请在最后一次之后添加以下内容print...进行更改:

org.codehaus.groovy.runtime.NullObject.metaClass.toString = {return 'null'}
Run Code Online (Sandbox Code Playgroud)

您还可以更改nulltoString使用Groovy的行为Category [1] [2] .例如:

@Category(org.codehaus.groovy.runtime.NullObject) class MyNullObjectCategory {def toString() {''}}
use (MyNullObjectCategory) {
    println "${a.a} ${a.b}"
}
Run Code Online (Sandbox Code Playgroud)

  • 根据你的答案,你也可以暂时用一个类别重新定义它:`@Category(NullObject)类NullObjectCategory {String toString(){''}}`,然后在任何你想要压制空值的地方`使用它':`use (NullObjectCategory){assert"$ aa $ ab"=='foobar'}` (4认同)

tim*_*tes 8

您可以toString在类中实现一个方法,如下所示:

class A{
  String name
  String address
  String toString() {
    "${name ?: ''} ${address ?: ''}".trim()
  }
}
Run Code Online (Sandbox Code Playgroud)

然后做

def a = new A( address:'some address' )
println a
Run Code Online (Sandbox Code Playgroud)

some address打印出来,但这仍然使用了你在问题中的Elvis操作符......

不确定你能做的更简单......