2016-07-13 6 views
7

Java-8ストリーム/ lambdasでは、どのようにキーのリストの平均を見つけることができますか?Javaの8ラムダは、マップのリストの平均を見つけることができます

例:古き良きforeachsで

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) 

それはそれはラムダで達成することができた場合、私は疑問に思って、非常に簡単です。私が必要とする理由は、Apache Sparkを使用する予定であり、Java-8ラムダがより標準的なアプローチになるということです。

+1

あなただけの2つの値を維持するためのマップを作成していますか? – Andrew

+0

実際、地図ではなく、scalaのTuple4です。現時点では4つの値がありますので、変更が予定されているためではありません – Bogdan

+0

@BogdanなぜScalaを使用しているときにJavaソリューションを求めていますか? – Flown

答えて

6

Andrew Tobilkoと言っていますが、Mapではなく、適切なデータ構造を使用する必要があります。

List<Map<>>を使用するとしたら、Stream::flatMapMap::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} 
関連する問題