次のオブジェクトとマップがあります。
MyObject
String name;
Long priority;
foo bar;
Map<String, List<MyObject>> anotherHashMap;
マップを別のマップに変換したい。結果マップのキーは、入力マップのキーです。結果マップの値は、優先順位で並べ替えられたMyオブジェクトのプロパティ「名前」です。
orderingおよび名前の抽出は問題ではありませんが、結果マップに入れることができませんでした。私はそれを古いJava 7方法で行いますが、ストリーミングAPIを使用することは可能です。
Map<String, List<String>> result = new HashMap<>();
for (String identifier : anotherHashMap.keySet()) {
List<String> generatedList = anotherHashMap.get(identifier).stream()...;
teaserPerPage.put(identifier, generatedList);
}
誰かアイデアはありますか?私はこれを試しましたが、行き詰まりました:
anotherHashMap.entrySet().stream().collect(Collectors.asMap(..., ...));
Map<String, List<String>> result = anotherHashMap
.entrySet().stream() // Stream over entry set
.collect(Collectors.toMap( // Collect final result map
Map.Entry::getKey, // Key mapping is the same
e -> e.getValue().stream() // Stream over list
.sorted(Comparator.comparingLong(MyObject::getPriority)) // Sort by priority
.map(MyObject::getName) // Apply mapping to MyObject
.collect(Collectors.toList())) // Collect mapping into list
);
基本的に、各エントリセットをストリーミングし、それを新しいマップに収集します。新しいマップの値を計算するには、List<MyOjbect>
古いマップから、並べ替えて、マッピングとコレクション機能を適用します。この場合、私はMyObject::getName
をマッピングとして使用し、結果の名前をリストに収集しました。
Map<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(
Map.Entry::getKey,
e -> e.getValue().stream()
.sorted(comparing(MyObject::getPriority))
.map(MyObject::getName)
.collect(Collectors.toList())));
Mike Kobitの回答に似ていますが、ソートは正しい場所に適用され(つまり、値はマップエントリではなくソートされます)、より簡潔な静的メソッドComparator.comparing
は、並べ替え用のコンパレータを取得するために使用されます。
別のマップを生成するには、次のようなものを使用できます。
HashMap<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(elem -> elem.getKey(), elem -> elem.getValue() // can further process it);
上記でマップを再作成していますが、必要に応じてキーまたは値を処理できます。