2016-07-13 20 views
7

W jaki sposób, z strumieniami Java/8, mogę znaleźć średnie z listy map według kluczy?Java 8 lambd do wyszukiwania średnich list map

Przykład:

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) 

ze starymi dobrymi foreachs Jest to dość proste, zastanawiam się, czy to może być osiągnięte z lambda. Powodem, dla którego tego potrzebuję, jest to, że zamierzam użyć Apache Spark, a lambda Java-8 będzie dla niego bardziej standardowym podejściem.

+1

ty stworzenie mapy tylko na utrzymanie 2 wartości? – Andrew

+0

cóż, w rzeczywistości nie jest to mapa, ale Tuple4 scala lib. w tej chwili są 4 wartości, więc nie jest tak z powodu nadchodzących zmian – Bogdan

+0

@Bogdan Dlaczego pytasz o rozwiązanie Java, gdy używasz Scala? – Flown

Odpowiedz

6

Jako Andrew Tobilko powiedział, należy użyć odpowiedniej struktury danych nie Map s.

Jeśli nalegać na użyciu List<Map<>> to trzeba Stream::flatMap z Map::entrySet i używać odpowiednich 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}