2016-03-24 15 views
-4

に変換し、java8とストリームapiを使用します。Map <Long、MyObject>をMap <long、List <MyObject>>

あり唯一のMyObjectにはある、と私は

Map<Long, MyObject> 

リストは、一つの要素を持っている
Map<Long, List<MyObject>> 

に変換したいですか?

+0

キーが1つしかない場合は、マップを使用する理由は?代わりにセットではない? –

+0

@ManuelS 1つの値で、1つのキーではありません。 – NimChimpsky

+0

MyObjectが1つしかありません。なぜ、リストを使用したいのですか? –

答えて

4
Map<Long, List<MyObject>> newMap = oldMap.entrySet().stream() 
       .collect(Collectors.toMap(
          Entry::getKey, 
          e -> new ArrayList<>(Arrays.asList(e.getValue())))); 

値の不変のリストに問題がない場合、最後の行は少し簡略化することができる。

      e -> Collections.nCopies(1, e.getValue()))); 
+1

このラムダ式は初心者のように見えるかもしれません。それでも有効で正しい。 +1 –

+1

@RoelStrolenberg OPに金色のバッジがあります。私は彼がとても緑色ではないと思います。 –

+0

私は何も言わなかった –

1
Map<Long, MyObject> yourMap = whateverYouImplementedHere; 
Map<Long, List<MyObject>> listMap = new HashMap<>(); 

for (Entry<Long, MyObject> entry : yourMap.entrySet()){ 

    listMap.put(entry.getKey(), new ArrayList<MyObject>(Arrays.asList(entry.getValue())); 
} 
+0

これはOPの一般的な質問を解決するだろうが、他のデータ構造はずっと良くなっている –

+0

これはJava 8のストリーム機能を使用しない – NimChimpsky

1

あなただけのエントリーセットのストリームを取得し、Collections.singletonListと組み合わせtoMapコレクタを使用することができます(不変のリストを作成する)を使用して、元のマップから新しい値を作成します。

Map<Long, List<MyObject>> transformedMap = 
    map.entrySet() 
     .stream() 
     .collect(toMap(Map.Entry::getKey, 
         e -> Collections.singletonList(e.getValue()))); 
関連する問題