2017-01-26 16 views
5

kullanarak bir sınıfın mülkiyet için düz eşleme toplayıcı Bu sınıf var.GrupingBy

class Assignment { 
    private Integer index; 
    private List<Quantity> quantities; 
} 

O zaman, bu sınıftaki nesnelerin bir listesi var.

List<Assigment> assignments = new ArrayList<>(); 

Assignment gelen indeks ve değerler olarak List<Quantity> içeren bir Map oluşturmak için bir yolu var mı?

Şimdiye kadar denediğim şey budur.

assignments.stream().collect(groupingBy(Assignment::getIndex)); 

Ama bu bana bir Map<Integer, List<Assignment>> verir ve ben bir Map<Integer, List<Quantity>> istiyorum.

Ben forEach yöntemi kullanarak denedi - ve workes - ama tek astar bunu yapmanın yolu olmalı eminim - var gibi görünüyor ya da en azından kullanan tek collect ve groupingBy yöntemleri

+2

: bir Stream<Quantity> döner Assignment içinyöntem olup, bu kodu kullanabilir. Ayrıca bkz. [Bu cevap] (http://stackoverflow.com/a/39131049/2711488). 3. alternatif “.collect (groupingBy (Assignment :: getIndex, Collector.of (ArrayList :: new, (l, a) -> l.addAll (a.getQuantities()), (a, b) -> olabilir. {a.addAll (b); return a;}))); ' – Holger

cevap

7

hiçbir düz haritalama Eğer Java8 içinde groupingBy için aşağı akışı olarak kullanabilirsiniz toplayıcı, ancak Java9 için önerilmiş ve kabul edilmiştir: https://bugs.openjdk.java.net/browse/JDK-8071600

public static <T, U, A, R> 
    Collector<T, ?, R> flatMapping(Function<? super T, ? extends Stream<? extends U>> mapper, 
            Collector<? super U, A, R> downstream) { 
     BiConsumer<A, ? super U> downstreamAccumulator = downstream.accumulator(); 
     return Collector.of(downstream.supplier(), 
          (r, t) -> mapper.apply(t).sequential().forEach(u -> downstreamAccumulator.accept(r, u)), 
          downstream.combiner(), 
          downstream.finisher(), 
          downstream.characteristics().stream().toArray(Collector.Characteristics[]::new)); 
    } 

Eğer biri olduğunu kullanın ve aynı zamanda bir eklersenizKurulan alternatif collect` `önce bir çift türüne 'flatMap` kullanmaktır

Map<Integer, List<Quantity>> result = assignments.stream() 
    .collect(groupingBy(Assignment::getIndex, 
     flatMapping(Assignment::quantities, toList())));