私はこのようなリストを持っています:
List<Map<String, Long>>
ラムダを使用して、このリストを次のように変換する方法はありますか?
Map<String, List<Long>>
例:
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1);
m1.put("B", 100);
Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10);
m2.put("B", 20);
m2.put("C", 100);
List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
フォーマット後:
Map<String, List<Long>> afterFormatting;
これは次のようになります。
A -> [1, 10]
B -> [100, 20]
C -> [100]
flatMap
を作成するには、各マップのエントリセットが必要Stream<Map.Entry<String, Long>>
です。次に、このStreamをgroupingBy(classifier, downstream)
コレクターで収集できます。分類子はエントリーのキーを返し、ダウンストリームコレクターはエントリーをその値にマップし、それをに収集しList
ます。
Map<String, List<Long>> map =
list.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
このコードには、次の静的インポートが必要です。
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
あなたの完全な例で:
public static void main(String[] args) {
Map<String, Long> m1 = new HashMap<>();
m1.put("A", 1l);
m1.put("B", 100l);
Map<String, Long> m2 = new HashMap<>();
m2.put("A", 10l);
m2.put("B", 20l);
m2.put("C", 100l);
List<Map<String, Long>> beforeFormatting = new ArrayList<>();
beforeFormatting.add(m1);
beforeFormatting.add(m2);
Map<String, List<Long>> afterFormatting =
beforeFormatting.stream()
.flatMap(m -> m.entrySet().stream())
.collect(groupingBy(Map.Entry::getKey, mapping(Map.Entry::getValue, toList())));
System.out.println(afterFormatting); // prints {A=[1, 10], B=[100, 20], C=[100]}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加