2012-05-09 16 views
10

Mam klasyjak pozbyć się "null", gdy zdobywasz łańcuch w groovy?

class A{ 
    String name 
    String address 
} 

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

Tutaj a.name jest zerowy, więc napis wydrukowany wola zawiera „null”, jednak mam nadzieję, że wynik jest "some address" które ignorują wartość zerową.

Wiem, że mogę używać println "${a.name ?: ''} ${a.address ?: ''}" podczas drukowania, czy jest jakieś prostsze rozwiązanie?

Odpowiedz

11

Można przedefiniować metody toString dla Groovy za null obiektu, aby powrócić pusty ciąg zamiast 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}" 

ten wypisze:

null foobar 
foobar 

Jeśli chcesz tylko przedefiniować toString tymczasowo, dodać następujący po ostatnim print... zmienić go z powrotem:

org.codehaus.groovy.runtime.NullObject.metaClass.toString = {return 'null'} 

Ty może również zmienić zachowanie użytkownika null g a Groovy Category[1][2]. Na przykład:

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

Opierając się na swoim Odpowiedź, możesz również tymczasowo przedefiniować ją za pomocą kategorii: '@Kategoria (NullObject) class NullObjectCategory {String toString() {''}}', a następnie 'use' to, gdzie chcesz wyciszyć wartości null:' use (NullObjectCategory) {assert "$ aa $ ab" == 'foobar'} ' –

+0

dziękuję, rozwiąże to mój problem, myślę, że nikt nie chce uzyskać" null "podczas drukowania ciągów do użytkowników na stronach internetowych – donnior

+0

@JustinPiper Dobry punkt! Dziękujemy za dodatkowe wejście. Aktualizuję odpowiedź. –

8

Można zaimplementować metodę toString w swojej klasie tak:

class A{ 
    String name 
    String address 
    String toString() { 
    "${name ?: ''} ${address ?: ''}".trim() 
    } 
} 

następnie zrobić

def a = new A(address:'some address') 
println a 

Aby uzyskać some address drukowane, ale to nadal używane operatora Elvis jak miałeś w swojej pytanie ...

Nie jestem pewien, że jest znacznie łatwiej ...

+0

dziękuję, chcę to potwierdzić! :) – donnior

+0

@donnior Jest milsza niż ta sama czynność wykonana w czystym Java ... Najmniejsze o czym myślę to: 'String.format ("% s% s ", nazwa == null?" ": Name , adres == null? "": address) .trim() ';-) –

3

Nie wiem, czy prostsze, ale:

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

Możesz oczywiście połączyć je z Tima toString suggestion.

Należy zauważyć, że jeśli którakolwiek z wartości może być "podrobiona" (np. 0), odfiltrowuje ją. Można ustalić, że robi:

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

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

Powiązane problemy