2012-05-09 8 views
10

मैं एक वर्गग्रोवी में स्ट्रिंग को समेकित करते समय "शून्य" से छुटकारा पाने के लिए कैसे?

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

आप ग्रूवी के 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'} 

आप null के toString व्यवहार में भी बदल सकते हैं जी एक ग्रोवी Category[1][2]। उदाहरण के लिए:

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

आपके लिए बिल्डिंग उत्तर, आप इसे एक श्रेणी के साथ अस्थायी रूप से फिर से परिभाषित कर सकते हैं: '@ श्रेणी (NullObject) वर्ग NullObjectCategory {स्ट्रिंग टूस्ट्रिंग() {' '}}', और उसके बाद 'इसका उपयोग करें' जहां भी आप नल को घुमाने के लिए चाहते हैं: 'उपयोग (NullObjectCategory) {assert "$ aa $ ab" == 'foobar'} ' –

+0

धन्यवाद, यह मेरी समस्या का समाधान करेगा, मुझे लगता है कि वेबपृष्ठों पर उपयोगकर्ताओं को स्ट्रिंग प्रिंट करते समय कोई भी" शून्य "प्राप्त नहीं करना चाहता – donnior

+0

@ जस्टिनपाइपर अच्छा बिंदु! अतिरिक्त इनपुट के लिए धन्यवाद। उत्तर अपडेट कर रहा है। –

8

तुम इतनी तरह अपनी कक्षा में एक toString विधि को लागू कर सकते हैं:

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

तो

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

प्राप्त करने के लिए some address बाहर मुद्रित, लेकिन यह अभी भी एल्विस ऑपरेटर इस्तेमाल किया जैसा कि आप में था अपने प्रश्न ...

सुनिश्चित नहीं है कि आप बहुत आसान कर सकते हैं ...

+0

धन्यवाद, मैं बस इसकी पुष्टि करना चाहता हूं! :) – donnior

+0

@donnior यह शुद्ध जावा में एक ही चीज़ की तुलना में मील की दूरी पर है ... सबसे छोटा मैं इसके बारे में सोच सकता हूं: 'String.format ("% s% s ", name == null?" ": Name , पता == शून्य? "": पता) .trim() ';-) –

3

सुनिश्चित नहीं हैं कि अगर सरल है, लेकिन:

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

आप निश्चित रूप से यह टिम toString suggestion के साथ गठबंधन कर सकते हैं।

ध्यान दें कि यदि कोई भी मान "गलत" (उदा। 0) हो सकता है, तो यह इसे फ़िल्टर करेगा। आपको लगता है कि कर ठीक कर सकते हैं:

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

मानचित्र के लिए [1: झूठा, 2: सत्य, 3: शून्य] .findAll {it.value! = null} – chim

संबंधित मुद्दे

 संबंधित मुद्दे