2016-07-13 4 views
7

Как с помощью потоков Java-8/lambdas можно найти средние значения Список карт по ключам?Java 8 lambdas найти средние списки карт

Пример:

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) 

С добрым старым foreachs это довольно просто, я интересно, если это может быть достигнуто с лямбды. Причина, в которой я нуждаюсь, заключается в том, что я собираюсь использовать Apache Spark, и Java-8 lambdas станет для него более стандартным подходом.

+1

вы создаете карту только для хранения 2 значения? – Andrew

+0

ну, на самом деле это не карта, а Tuple4 scala lib. на данный момент есть 4 значения, так что это не так из-за непредусмотренных изменений. – Bogdan

+0

@Bogdan Почему вы запрашиваете решение Java, когда используете Scala? – Flown

ответ

6

Как Andrew Tobilko сказал, что вы должны использовать соответствующую структуру данных не Map s.

Если вы настаиваете на использовании List<Map<>>, то вам нужно Stream::flatMap в Map::entrySet и использовать соответствующие Collector с.


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} 
Смежные вопросы