2012-05-09 78 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