2012-05-09 80 views
10

我有一个类如何在groovy中串接字符串时摆脱“null”?

class A{ 
    String name 
    String address 
} 

def a = new A() 
a.address = "some address"  
println "${a.name} ${a.address}" => "null some address" 

这里a.name是空的,所以字符串印刷意志包含“空”,但是我希望结果是"some address"其忽略空值。

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

回答

11

你可以重新定义Groovy的null对象toString方法,而不是返回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'} 

你也可以改变nulltoString行为usin g Groovy Category[1][2]。例如:

@Category(org.codehaus.groovy.runtime.NullObject) class MyNullObjectCategory {def toString() {''}} 
use (MyNullObjectCategory) { 
    println "${a.a} ${a.b}" 
} 
+4

建立在你的答案,你也可以暂时用一个类别来重新定义它:'@Category(NullObject)class NullObjectCategory {String toString(){''}}',然后在任何你想压制空值的地方使用它:'use(NullObjectCategory) {assert“$ aa $ ab”=='foobar'}' –

+0

谢谢,这将解决我的问题,我认为在网页上向用户打印字符串时没有人想要“空” – donnior

+0

@JustinPiper好点!感谢您的额外输入。更新答案。 –

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操作符如你有你问题...

不确定你可以做的简单得多...

+0

谢谢,我只是想确认一下! :) – donnior

+0

@donnior它的英里比在纯Java中做的同样的事情更好......我能想到的最小的是:'String.format(“%s%s”,name == null?“”:name ,address == null?“”:address).trim()';-) –

3

不知道简单,但是:

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

你当然可以用添的toString suggestion结合起来。

请注意,如果任何值可能是“虚假”(例如0),则会将其过滤掉。您可以修复,这样做:

[a.name, a.address].findAll {it != null}.join(' ') 
+0

for map [1:false,2:true,3:null] .findAll {it.value!= null} – chim