2016-07-13 68 views
7

In che modo, con Java-8 stream/lambda, è possibile trovare le medie dell'elenco di mappe per chiavi?Java 8 lambda per trovare le medie dell'elenco di mappe

Esempio:

List<Map<String, Double>> users = Arrays.asList(
    new HashMap<String, Double>() 
    {{ 
     put("weight", 109.0); 
     put("height", 180.2);   
    }}, 
    new HashMap<String, Double>() 
    {{ 
     put("weight", 59.0); 
     put("height", 186.2);   
    }} 
); 

Map<String, Double> statistics = 
//<MISSED CODE with lambdas> (?) 

System.out.println(statistics); 
//{weight=84.0, height=183.1) 

Con i vecchi buoni foreachs è abbastanza semplice, mi chiedo se questo potrebbe essere realizzato con lambda. Il motivo per cui ne ho bisogno è che userò Apache Spark e Java-8 lambda sarà un approccio più standard per questo.

+1

stai creando una mappa solo per mantenere 2 valori? – Andrew

+0

beh, in effetti non è una mappa ma Tuple4 di scala lib. al momento ci sono 4 valori, quindi non è il caso a causa delle prossime modifiche – Bogdan

+0

@Bogdan Perché stai chiedendo una soluzione Java quando stai usando Scala? – Flown

risposta

6

Come detto Andrew Tobilko, è necessario utilizzare una struttura dati adeguata non Map s.

Se ti ostini a usare List<Map<>> allora avete bisogno di Stream::flatMap il Map::entrySet e utilizzare la corretta Collector s.


List<Map<String, Double>> users = Arrays.asList(new HashMap<String, Double>() { 
    { 
    put("weight", 109.0); 
    put("height", 180.2); 
    } 
}, new HashMap<String, Double>() { 
    { 
    put("weight", 59.0); 
    put("height", 186.2); 
    } 
}); 

Map<String, Double> statistics = users.stream().flatMap(m -> m.entrySet().stream()) 
    .collect(
     Collectors.groupingBy(Entry::getKey, Collectors.averagingDouble(Entry::getValue)) 
    ); 

System.out.println(statistics); 
// {weight=84.0, height=183.2}