2015-01-12 9 views
14

मैं जैसे एक धारा है:Java8 स्ट्रीम - स्ट्रीम भिन्न के साथ डुप्लिकेट निकालें

Arrays.stream(new String[]{"matt", "jason", "michael"}); 

मैं ऐसे नाम हैं जो एक ही अक्षर से शुरु दूर करने के लिए इतना है कि केवल एक ही नाम (कोई फर्क नहीं पड़ता जो) शुरुआत चाहते हैं उस पत्र के साथ छोड़ दिया गया है।

मैं समझने की कोशिश कर रहा हूं कि distinct() विधि कैसे काम करती है। मैंने प्रलेखन में पढ़ा है कि यह किसी ऑब्जेक्ट की "बराबर" विधि पर आधारित है। हालांकि, जब मैं स्ट्रिंग को लपेटने का प्रयास करता हूं, तो मुझे लगता है कि बराबर विधि कभी नहीं बुलाई जाती है और कुछ भी नहीं हटाया जाता है। क्या मैं यहाँ कुछ याद कर रहा हूँ?

आवरण वर्ग:

static class Wrp { 
    String test; 
    Wrp(String s){ 
     this.test = s; 
    } 
    @Override 
    public boolean equals(Object other){ 
     return this.test.charAt(0) == ((Wrp) other).test.charAt(0); 
    } 
} 

और कुछ सरल कोड:

public static void main(String[] args) { 
    Arrays.stream(new String[]{"matt", "jason", "michael"}) 
    .map(Wrp::new) 
    .distinct() 
    .map(wrp -> wrp.test) 
    .forEach(System.out::println); 
} 
+2

वहाँ तकनीक मैं [इस उत्तर] में वर्णित है (http://stackoverflow.com/a/27872086/1441122)। (उत्तर के अंत तक स्क्रॉल करें)। यह आपको 'फिल्टर (विशिष्ट ByKey (एस -> s.charAt (0)) करने देता है) '। –

+6

साइड नोट: शाब्दिकों की एक धारा के लिए, 'Stream.of ("मैट", "जेसन", "माइकल") का उपयोग करना अक्सर आसान होता है। –

उत्तर

14

जब भी आप equals ओवरराइड, आप भी hashCode() विधि है, जो distinct() के कार्यान्वयन में इस्तेमाल किया जाएगा ओवरराइड करने के लिए की जरूरत है।

इस मामले में, तुम सिर्फ

@Override public int hashCode() { 
    return test.charAt(0); 
} 

... जो ठीक काम करेगा इस्तेमाल कर सकते हैं।

+5

हाँ, यह काम करता प्रतीत होता है। यह अच्छा होगा अगर आप इसे थोड़ा आसान बनाने के लिए एक तुलनित्र को 'विशिष्ट' में पारित कर सकें। –

+4

यदि आप यही चाहते हैं, तो आप इसे 'ट्रीसेट' में डंप कर सकते हैं। –

+5

आप सही हैं ... कभी-कभी जब आपको एक नया हथौड़ा मिलता है तो सबकुछ एक नाखून की तरह दिखने लगता है। ;-) –

5

वैकल्पिक दृष्टिकोण

String[] array = {"matt", "jason", "michael"}; 
    Arrays.stream(array) 
      .map(name-> name.charAt(0)) 
      .distinct() 
      .map(ch -> Arrays.stream(array).filter(name->name.charAt(0) == ch).findAny().get()) 
      .forEach(System.out::println); 
संबंधित मुद्दे