2017-11-18 6 views
1

私は以下の構造を扱っています。ネストされたHashMapsをラムダでカウント

Map<String, HashMap<Integer, HashMap<Integer, Integer>>> ... 

私は内部のHashMapの値でカウンタをインクリメントしたいと思います。 反復関数またはネストループを使用して簡単に行うことができます。 しかし、私はlambdasを使用してエレガントなソリューションを探しています。

+0

私が正しく理解していれば、最も内側の 'Map 'の値の和を求めたいでしょうか? – 4castle

+0

正確には、それは私の目標です –

+3

今のところあなたの質問は不明です。 「カウンタをインクリメントする」とは「counter = counter + 1;」と解釈されるかもしれませんが、あなたは 'counter 'とみなしています。 [編集]オプションを使用して質問を明確にします(入力と期待される結果の例が望ましい)。 – Pshemo

答えて

5

Mapの値のStreamを取得するには、.values().stream()を使用できます。次に、Stream<Integer>が得られるまで、入れ子構造をはがすために繰り返し.flatMapを適用することができます。次に.mapToIntを使用してIntStreamを作成し、すべての値の.sum()を取得することができます。

int sum = outerMostMap.values().stream() // HashMap<Integer, HashMap<Integer, Integer>> 
    .flatMap(map -> map.values().stream()) // HashMap<Integer, Integer> 
    .flatMap(map -> map.values().stream()) // Integer 
    .mapToInt(Integer::intValue)   // int 
    .sum(); 
+0

ラムダが必要ない場合、 'flatMap(map - > ...)'の代わりに '.map(Map :: values).flatMap(Collection :: stream)' – Zabuza

+1

OPと将来の読者のためのあなたのアプローチを説明できますか? – Zabuza

+0

この優雅なソリューションをありがとう!出力は正しいです。もう少し説明していただけますか? –

関連する問題