web-dev-qa-db-ja.com

Java 8ストリーム:リストのマップを反復

次のオブジェクトとマップがあります。

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(..., ...));
10
waXve
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をマッピングとして使用し、結果の名前をリストに収集しました。

11
mkobit
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は、並べ替え用のコンパレータを取得するために使用されます。

2
Alex Filatov

別のマップを生成するには、次のようなものを使用できます。

HashMap<String, List<String>> result = anotherHashMap.entrySet().stream().collect(Collectors.toMap(elem -> elem.getKey(), elem -> elem.getValue() // can further process it);

上記でマップを再作成していますが、必要に応じてキーまたは値を処理できます。

1
nitishagar