2016-02-27 41 views
5

ile gruplandırma bazı sorun aşağıdakiler için Akış API kullanarak iyi bir yaklaşım/uygulama bulmakta. Şimdi elemanları dize değerleri ile gruplamaktan hoşlanıyorum ve her grup için o grupla ilgili öğelerden gelen tamsayı değerlerini toplamayı seviyorum.Java 8 Akış:</p> <p>Ben unsurların bir listesi var, bir dize ve bir tamsayı oluşan her bir öğeyi: toplama

Örnek: sahip, aşağıdaki 3 elemanlar:

("GroupA, 150) ("GroupB, 10) 

I:

("GroupA", 100) ("GroupA", 50) ("GroupB", 10) 

Ve takip eden iki (anahtar değeri) 'dan oluşan bir ilk çift olsun ister bir sonucu olarak Bunu nasıl çözeceğimi bilmiyorum. Ben şimdiye kadar geldi en umut verici şudur:

elements.stream().collect(Collectors.groupingBy(e-> e.getGroup())) 
      .merge(group, elementsOfTheGroup, (...)); 

Ama birleştirme yönteminin son parametre olarak eklemek hangi fonksiyonu emin değilim. Ama birleştirme yöntemini kullanmam gerekip gerekmediğini bilmiyorum.

Bunun için en zarif uygulama ne olurdu?

cevap

8

Aşağı akış toplayıcıyı Collectors.groupingBy(classifier, downstream)'a eklemeniz gerekir. Bu koleksiyoncular aynı anahtara sınıflandırılmış tüm öğeleri toplar. Bu durumda, tüm sayıları Collectors.summingInt(mapper) kullanarak birlikte toplamalıyız, eşleştirici, sayıyı toplamı döndüren bir işlevdir.

toplamamaddesi getNumber() ile alınabilir bu sayıyı varsayarsak, olabilir:

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     e -> e.getGroup(), 
     Collectors.summingInt(e -> e.getNumber()) 
    )); 

yerine yukarıdaki iki lambdas bir yöntem-başvuru kullanabilirsiniz. Öğelerin sınıfı Element ise,

Map<String, Integer> result = 
    elements.stream().collect(Collectors.groupingBy(
     Element::getGroup, 
     Collectors.summingInt(Element::getNumber) 
    )); 
+0

büyük, teşekkür ederiz! – user3237736