2017-03-04 13 views
2

のString、MyObjectに>> myObject1とmyObject3が同じ一意のIDを持っているMap<String, List<MyObject>> to List<Map<String, MyObject>>は、リスト<MyObject>は私が変換したい地図<javaの

{<key1,[myObject1, myObject2]>, <key2,[myObject3, myObject4]>} will be converted to [{<key1,myObject1>, <key2,myObject3>}, {<key1,myObject2>, <key2, myObject4>}]

とそう<リストに地図<文字列を変換しますmyObject2とmyObject4。

私の実装は以下ですが、これを行うためのより良い方法があります。

private List<Map<String, MyObject>> getObjectMapList(Map<String, List<MyObject>> objectMap) 

{ 
    List<Map<String, MyObject>> objectMapList = new ArrayList<Map<String,MyObject>>(); 

for(MyObject myObject : objectMap.get("key1")) {// there will be default key1 whose value is known 

     Map<String, MyObject> newMap= new HashMap<String, MyObject>(); 
     for (String key : objectMap.keySet()) { 
      newMap.put(key, objectMap.get(key).stream() 
        .filter(thisObject -> thisObject.getId().equals(myObject.getId())) 
        .collect(Collectors.toList()).get(0)); 
     } 
     objectMapList.add(newMap); 
    } 
    return objectMapList; 

} 
+0

(それが動作する合理的な可能性がありますか)? – Jeff

+0

はいくつかのタイプミスでした。編集しました – user3330263

答えて

0

このストリームは、必要な結果を返します。私の古いEclipse版では、タイプにいくつか問題がありました。シングルステップに分割したり、ラムダでいくつかのタイプを追加しなければならないかもしれませんが、私はそれを短くしたいと思っていました。そのキーを持つすべての入力の値の

  1. ペアすべてのオブジェクトと一つの長いリスト(flatMap(key -> streamOfKeyObjectPairs))に入れ:

    Map<String, List<MyObject>> objectMap = new HashMap<>(); 
    
    objectMap.keySet() 
         .stream() 
         .flatMap(key -> objectMap.get(key) 
                .stream() 
                .map(obj -> new AbstractMap.SimpleEntry<>(key, obj))) 
         .collect(groupingBy(pair -> pair.getValue().getId())) 
         .values() 
         .stream() 
         .map(listOfSameIds -> listOfSameIds.stream() 
                  .collect(toMap(SimpleEntry::getKey, SimpleEntry::getValue))) 
         .collect(toList()); 
    

    私は何をやっていることです。

  2. これらのペアをオブジェクトのIDで区切ります(collect(groupingBy))。
  3. ここで1-ライナーは任意の中括弧なしだリストに
+0

私はそれを動作させることができませんでした。 splitingが別の操作にある場合、groupingBy(pair - > pair.getValue()。getId())は不明なオブジェクトイベントについて文句を言います – user3330263

+0

groupingByメソッドのインポートを追加しましたか?インポートが欠落していないかどうかを確認するために 'Collectors.groupingBy'を書いてください。それ以外の場合は、 'pair - > pair.getValue()。getId()'を '(SimpleEntry pair) - > pair.getValue()。getId()で置き換えて明示的に' ) '。それでも機能しない場合、関数変数にラムダを割り当てることができます: 'Function 、ID_TYPE> toID = pair-> pair.getValue()。getId()'。 –

1

をすべてのそれらのマップを入れ

  • map(list -> toMap))これらのグループのそれぞれを取り、マップへのペアのリストを変換:

    private List<Map<String, MyObject>> getObjectMapList(Map<String, List<MyObject>> objectMap) { 
        return map.entrySet().stream() 
         .map(e -> e.getValue().stream() 
         .map(o -> Collections.singletonMap(e.getKey(), o)) 
         .collect(Collections.toList()) 
        .flatMap(List::stream) 
        .collect(Collections.toList()); 
    } 
    

    ここでの主な「トリック」は、Collections.singletonMap()を使用して、ブロックのないインラインのマップの作成と作成を可能にすることです。


    免責事項:コードをコンパイルするか、それは私の携帯電話上で使い込まれたように動作しない場合があり `language`変数から来たん

  • +0

    いいですね、私は 'singletonMap'を念頭に置いていきます。しかし、これは 'MyObject.getId()'によってペアをグループ化しますか?または、結果リストの各マップには1つのマッピングしか含まれていませんか? –

    +0

    @MalteHartwigのみ1つのマッピング – Bohemian

    関連する問題