我上课了
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)
您还可以更改null的toString使用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)
您可以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操作符......
不确定你能做的更简单......
| 归档时间: |
|
| 查看次数: |
8650 次 |
| 最近记录: |