2017-12-13 5 views
4

Map <String,List<Map<String,Object>>のような構造を持っています。次のように関数をマップに適用したいと思います。このメソッドはキーを受け取り、リストの マップ<String,Object>を使用します。各キーには、リスト内にいくつかのマップ<String,Object>があります。どのようにマップの各値に対してマップのキーにプロセスメソッドを適用できますか?私はfor Eachループ(下記参照)に使用することができましたが、これは機能的な方法で問題を解決する最良の方法ではないと感じています。Java 8 -Flatten Map with Lists

TypeProcessor p=new TypeProcessor.instance(); 

//Apply this function to the key and each map from the list 
// The collect the Result returned in a list. 
Result process(String key, Map<String,Object> dataPoints); 
List<Result> list = new ArrayList<>(); 
map.forEach(key,value) -> { 
    value.forEach(innerVal -> { 
    Result r=p.process(key,innerVal); 
    list.add(r): 
    }); 
}); 
+0

この**コンパイル**はありますか? '' p.process(...) 'のような通常のメソッド呼び出しで、**型**を書くことができる理由はありません。また、 'new ArrayList <>()'の最後にセミコロンがないようです。また、 'value.forEach(' '(' '' innverVal'では閉じられていない '' 'を開き、' - > 'の後ろに' {...} 'を入れて実行していなければなりません2つ以上のステートメント – Zabuza

+0

私は単純に動作するコードの一部をタイプしました。私はちょうど動作するプロシージャを示しています。ここのコードはアプリケーションのものとまったく同じではなく、 – BreenDeen

答えて

2

あなたができるので、それは、あなたが全体Mapためprocessを適用したいあなたのコードかららしいですそれはこのようです:

List<Result> l = map.entrySet() 
      .stream() 
      .flatMap(e -> e.getValue().stream().map(value -> process(e.getKey(), value))) 
      .collect(Collectors.toList()); 
2

まあ、mapkeyが含まれていると仮定すると、あなたはどんなforeachを必要としません。ちょうどそれをストリーム、外側mapから値を取得し、あなたの新しいオブジェクトにマッピングしてに収集List

List<Result> list = 
    map.get(key) 
     .stream() 
     .map(v -> p.process(key,v)) 
     .collect(Collectors.toList());