2015-10-26 6 views
9

मेरे पास निम्न श्रेणी है।कस्टम कलेक्टर का उपयोग कर जावा 8 ग्रुपिंग?

class Person { 

    String name; 
    LocalDate birthday; 
    Sex gender; 
    String emailAddress; 

    public int getAge() { 
     return birthday.until(IsoChronology.INSTANCE.dateNow()).getYears(); 
    } 

    public String getName() { 
     return name; 
    } 
} 

मैं उम्र से समूह के लिए सक्षम होने के लिए और उसके बाद व्यक्ति वस्तु ही व्यक्तियों के नाम के बजाय की सूची को इकट्ठा करना चाहते हैं; सब एक अच्छा लांबा अभिव्यक्ति में।

इस सब को सरल बनाने के लिए मैं अपने वर्तमान समाधान को जोड़ रहा हूं जो समूह के परिणाम को उम्र के आधार पर संग्रहीत करता है और फिर नाम एकत्र करने के लिए इसे फिर से चलाता है।

ArrayList<OtherPerson> members = new ArrayList<>(); 

members.add(new OtherPerson("Fred", IsoChronology.INSTANCE.date(1980, 6, 20), OtherPerson.Sex.MALE, "[email protected]")); 
members.add(new OtherPerson("Jane", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.FEMALE, "[email protected]")); 
members.add(new OtherPerson("Mark", IsoChronology.INSTANCE.date(1990, 7, 15), OtherPerson.Sex.MALE, "[email protected]")); 
members.add(new OtherPerson("George", IsoChronology.INSTANCE.date(1991, 8, 13), OtherPerson.Sex.MALE, "[email protected]")); 
members.add(new OtherPerson("Bob", IsoChronology.INSTANCE.date(2000, 9, 12), OtherPerson.Sex.MALE, "[email protected]")); 

Map<Integer, List<Person>> collect = members.stream().collect(groupingBy(Person::getAge)); 

Map<Integer, List<String>> result = new HashMap<>(); 

collect.keySet().forEach(key -> { 
      result.put(key, collect.get(key).stream().map(Person::getName).collect(toList())); 
}); 

Current solution

आदर्श नहीं और सीखने की खातिर मैं एक और अधिक सुरुचिपूर्ण और प्रदर्शन समाधान करना चाहते हैं के लिए।

उत्तर

9

जब Collectors.groupingBy के साथ एक स्ट्रीम समूहीकरण, आप एक कस्टम Collector साथ मूल्यों पर कमी आपरेशन निर्दिष्ट कर सकते हैं । यहां, हमें Collectors.mapping का उपयोग करने की आवश्यकता है, जो एक फ़ंक्शन (मैपिंग क्या है) और एक संग्राहक (मैप किए गए मानों को कैसे एकत्रित करें) लेता है। इस मामले में मैपिंग Person::getName है, यानी एक विधि संदर्भ जो व्यक्ति का नाम देता है, और हम इसे List में एकत्र करते हैं।

Map<Integer, List<String>> collect = 
    members.stream() 
      .collect(Collectors.groupingBy(
       Person::getAge, 
       Collectors.mapping(Person::getName, Collectors.toList())) 
      ); 
+0

ओपीएस, यह आसान था एह! चीयर्स! – lcardito

0

आप एक mappingCollector व्यक्ति नामों की सूची को Person की सूची मैप करने के लिए उपयोग कर सकते हैं:

Map<Integer, List<String>> collect = 
    members.stream() 
      .collect(Collectors.groupingBy(Person::getAge, 
              Collectors.mapping(Person::getName, Collectors.toList()))); 
1

तुम भी Collectors.toMap का उपयोग करें और चाबी, मूल्य के लिए मानचित्रण प्रदान करते हैं और समारोह विलय (यदि हो तो) कर सकते हैं।

Map<Integer, String> ageNameMap = 
    members.stream() 
      .collect(Collectors.toMap(
       person -> person.getAge(), 
       person -> person.getName(), (pName1, pName2) -> pName1+"|"+pName2) 
    ); 
संबंधित मुद्दे