2015-10-26 23 views
9

Aşağıdaki sınıfa sahibim.Java 8 Özel koleksiyonlayıcı kullanarak gruplama?

Yaşına göre gruplandırılabilir ve ardından Kişiler nesnesinin kendisi yerine kişi adlarının listesini toplayabilirim; hepsi tek bir güzel lamba ifadesinde.

Tüm bunları basitleştirmek için, gruplandırmanın sonucunu yaşa göre saklayan mevcut çözümümü bağlarım ve daha sonra adları toplamak için bunu yineliyorum.

Current solution

İdeal Değil

ve daha zarif ve sahne çözüm olsun isterim öğrenme uğruna

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())); 
}); 
.

cevap

9

, bir özel Collector ile değerler üzerinde bir azalma işlemi belirtebilirsiniz . Burada Collectors.mapping'u kullanmalıyız. Bu, bir işlevi (haritalamanın ne olduğunu) ve bir toplayıcıyı (eşlenmiş değerleri nasıl toplayacak) alır. Bu durumda, eşleme Person::getName, yani Kişinin ismini veren bir yöntem referansıdır ve bunu bir List içine alırız.

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

Ops, bu kolaydı! Şerefe! – lcardito

0

Bir mappingCollector kişi isim listesi için Person listesini eşleştirmek için kullanabilirsiniz: Collectors.groupingBy ile Akışı gruplandırırken

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

Ayrıca Collectors.toMap kullanmak ve anahtar, değer eşleme sağlamak ve (varsa) işlevini birleştirebilirsiniz.

Map<Integer, String> ageNameMap = 
    members.stream() 
      .collect(Collectors.toMap(
       person -> person.getAge(), 
       person -> person.getName(), (pName1, pName2) -> pName1+"|"+pName2) 
    );