11

クラスがあります

class A{
    String name
    String address
}

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

ここではnullなので、出力される文字列には「null」が含まれますが、結果としてnull値が無視されるa.nameことを願っています。"some address"

println "${a.name ?: ''} ${a.address ?: ''}"印刷時に使用できることはわかっていますが、もっと簡単な解決策はありますか?

4

4 に答える 4

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}"

これは印刷されます:

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に、しかしこれはあなたがあなたの質問で持っていたようにまだエルビス演算子を使用しました...

あなたができるもっと簡単なものがあるかどうかはわかりません...

于 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を削除する方法は、文字列を連結してreplaceメソッドを使用することだと思います。

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