Javaで開発していると、Map を List に変換したい場面は非常に多くあります。
特に Java 8以降のStreams API を使うことで、可読性の高いスマートな変換が可能になりました。
本記事では、
-
keyだけを List にしたい -
valueだけを List にしたい -
Map.Entryを List にしたい -
加工・フィルタ・ソートしながら List 化したい
といった 実務で使う全パターン を網羅的に解説します。
サンプルデータ(共通)
|
1 2 3 4 5 |
Map<String, Integer> map = Map.of( "Apple", 100, "Banana", 80, "Orange", 120 ); |
① Mapの value を List に変換
最もよく使う基本形
|
1 2 3 |
List<Integer> valueList = map.values() .stream() .collect(Collectors.toList()); |
✔ 値だけ欲しい
✔ 並び順は Map 依存(HashMapは保証なし)
② Mapの key を List に変換
|
1 2 3 |
List<String> keyList = map.keySet() .stream() .collect(Collectors.toList()); |
キー一覧が必要な場合に使用します。
③ Mapを EntryのList に変換(王道)
|
1 2 3 4 |
List<Map.Entry<String, Integer>> entryList = map.entrySet() .stream() .collect(Collectors.toList()); |
✔ key と value 両方を扱いたい
✔ この後の加工処理の起点として最重要パターン
④ value を 加工して List に変換
例:value を 2倍にする
|
1 2 3 4 5 |
List<Integer> doubledList = map.values() .stream() .map(v -> v * 2) .collect(Collectors.toList()); |
map() を挟むことで、自由に変換できます。
⑤ 条件で filter して List 化
例:value が 100以上のものだけ
|
1 2 3 4 5 |
List<Integer> filteredList = map.values() .stream() .filter(v -> v >= 100) .collect(Collectors.toList()); |
⑥ key + value を 独自オブジェクトの List に変換
DTOクラス
|
1 2 3 4 5 6 7 8 9 |
class Fruit { String name; int price; Fruit(String name, int price) { this.name = name; this.price = price; } } |
変換処理
|
1 2 3 4 5 |
List<Fruit> fruitList = map.entrySet() .stream() .map(e -> new Fruit(e.getKey(), e.getValue())) .collect(Collectors.toList()); |
✔ 実務で最も使われる応用パターン
✔ DB登録・APIレスポンス用に便利
⑦ ソートしてから List に変換
value 昇順でソート
|
1 2 3 4 5 |
List<Map.Entry<String, Integer>> sortedList = map.entrySet() .stream() .sorted(Map.Entry.comparingByValue()) .collect(Collectors.toList()); |
降順にしたい場合
|
1 |
.sorted(Map.Entry.comparingByValue(Comparator.reverseOrder())) |
⑧ Stream API を使わない(比較用)
|
1 |
List<Integer> list = new ArrayList<>(map.values()); |
✔ シンプル
✖ 加工・条件・並び替え不可
👉 Streamsの方が拡張性◎
よくある失敗ポイント
| 失敗例 | 理由 |
|---|---|
| map.stream() | Map自体はstream不可 |
| 並び順を期待する | HashMapは順序保証なし |
| nullを考慮していない | NPEの原因 |
どのパターンを使うべき?
| やりたいこと | おすすめ |
|---|---|
| 値だけ欲しい | map.values().stream() |
| keyとvalue両方 | entrySet().stream() |
| 加工・条件付き | map() / filter() |
| 並び替え | sorted() |
まとめ
-
Map → List変換は Streams が最強
-
entrySet().stream()が基本起点 -
filter / map / sorted を組み合わせるだけで実務対応可
Java Streams を正しく使えば、
短く・読みやすく・安全なコード が書けます。
