JavaのListやMapなどのコレクションは、Map→List、List→Mapへ変換することが可能です。
この記事では、そんなMapとListの変換方法について、以下の内容で解説していきます。
- 【基礎】MapとListの違い
- 【基礎】MapからListへ変換
- 【基礎】ListからMapへ変換
- 【発展】Java8のStreamを使う方法
今回はMapとListの変換について、さまざまな方法をわかりやすく解説します!
なお、Javaの記事については、こちらにまとめています。
MapとListの違い
そもそも、MapとListはどちらもコレクションの一種ですが何が違うのでしょうか?
MapをListに変換するメリット、ListをMapに変換するメリットはどこにあるのでしょうか?詳しく解説していきます。
特長の違い
Mapはインデックスとなるkeyとそのデータとなるvalueの両方を定義することができます。keyには整数値のほかにString型などの変数なども指定することができます。keyに指定した変数から、valueを呼び出すことができます。
なお、Mapのキーは重複させることはできません。これに対して、Listは要素を格納した順に自動的に整数値のインデックスが生成され、値と紐づけされます。
Listの要素はインデックス番号を指定して、値を呼び出します。keyと関連付けて値を保持する必要がある場合はMapが適しています。
また、Listは要素の値で並び順を替えるソートができますが、Mapはそのままではできません。
MapのkeyやvalueをListや配列に変換する必要があります。要素の順番が必要となる場合はListが適しています。これから先の解説を参考にして、目的に合わせて変換できるようにしましょう!
定義の違い(HashMapとArrayList)
MapやListはインターフェースですので、インスタンスを生成するには別のクラスを使用する必要があります。
Mapの場合はHashMapクラスを、Listの場合はArrayListクラスなど、インターフェースを実装したクラスを使用します。
これらを使って以下のように定義します。
Map<String, Integer> map = new HashMap<>(); List<String> list = new ArrayList<>();
MapもListもインターフェースで、インスタンスを生成することはできませんが、オブジェクトは宣言できます。それぞれのインターフェースを実装したクラスのインスタンスをオブジェクトに格納しています。
なお、この例ではMapのkeyはString型、valueはInteger型で指定されています。型の指定はクラス型で行います。
int型などのプリミティブ型は使用できないので注意しましょう。
MapからListへ変換
ここでは、MapのkeyをListに変換する方法、MapのvalueをListに変換する方法をそれぞれ解説していきます!
MapのkeyをListに変換
Mapのkey(キー)をListに変換するにはkeySetメソッドを使用します。
以下に、MapのキーをListに変換する方法を記述します。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { //Mapの宣言 Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("orange", 2); map.put("melon", 3); //Listを宣言し、keySetメソッドを使用してキーの値を取得する List<String> list = new ArrayList<>(map.keySet()); System.out.println(list); } }
実行結果:
[apple, melon, orange]
サンプルではMapクラスを宣言し、変数mapにputメソッドを使用して、キーと値をそれぞれ設定しています。
次にListクラスを宣言し、keySetメソッドを使用してMapのキーを変数listに格納しています。Listの中身を確認すると、Mapで追加したkeyが全て取得されているのがわかります。
MapのvalueをListに変換
value(値)を取得する場合はvaluesメソッドを使用します。
Mapの値をListに変換するためには、紹介したサンプルの「Listを宣言してMapのキーを取得する箇所」を変更して、以下のように記述します。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { //Mapの宣言 Map<String, Integer> map = new HashMap<>(); map.put("apple", 1); map.put("orange", 2); map.put("melon", 3); //Listを宣言し、valuesメソッドを使用して値を取得する List<Integer> list = new ArrayList<>(map.values()); System.out.println(list); } }
実行結果:
[2, 1, 3]
keyの値取得と異なる点は、MapをListに変換時にkeyの取得はkeySetメソッドを使用しているのに対して、valueを取得する場合はvaluesメソッドを使用しています。
Listの中身を確認すると、Mapで追加したvalueが全て取得されているのがわかります。
ListからMapへ変換
ここでは、Listで設定した値をMapのkeyとvalueへ変換する方法を、それぞれ解説します。
Listの値をMapのkeyに変換
以下に、Listの値をMapのkeyへ設定するサンプルコードを記述します。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { //Listの宣言 List<Integer> list = new ArrayList<>(); list.add(1); list.add(2); list.add(3); //Mapの宣言 Map<Integer, String> map = new HashMap<>(); for(Integer num : list) { // MapにListのキーと値を追加 map.put(num, "apple"); } System.out.println(map); } }
実行結果:
{1=apple, 2=apple, 3=apple}
サンプルではListクラスを宣言し、変数listに値を追加しています。
次にMapクラスを宣言し、拡張for文を使用してlistをループして、Listの値をputメソッドでMapのkeyとして格納しています。
Listの値をMapのvalueへ変換
以下に、Listの値をMapのvalueへ設定するサンプルコードを記述します。
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Main { public static void main(String[] args) { //Listの宣言 List<String> list = new ArrayList<>(); list.add("apple"); list.add("orange"); list.add("melon"); //Mapの宣言 Map<Integer, String> map = new HashMap<>(); int i = 1; for(String str : list) { // MapにListの値を追加 map.put(i, str); i++; } System.out.println(map); } }
実行結果:
{1=apple, 2=orange, 3=melon}
サンプルではListクラスを宣言し、変数listに値を追加しています。次にMapクラスを宣言し、拡張for文を使用してlistをループして、putメソッドでMapの要素を格納しています。
Mapのkeyに関しては、変数int型の変数iを宣言し、ループでインクリメントしてMapのkeyとして設定しています。
実行結果を確認すると、変数mapのvalueが取得されていることがわかります。
Java8のStreamを使う方法
Java8ではStream APIを使用できるようになりました。
MapからListへ変換する方法は変わりありませんが、ListからMapへ変換する方法が簡潔に記述できるようになりました。
例えば、Listの文字列をMapのkeyにその文字列の長さをvalueに格納したMapに変換する場合、以下のように記述することができます。
Map<String, Integer> map = list.stream() // 1. listをstream()に渡す。 .collect(Collectors.toMap( // 2. streamをcollect()メソッドに渡し、CollectorsクラスのMapインスタンス生成メソッドを実行します s -> s, // 3. Mapキーを取得するラムダ式 s -> s.length() // 4. Mapの値を取得するラムダ式 ));
詳しい説明については、こちらのサイトを参考にしてくださいね、
初期化、値の取得などMapについて知りたい!
初期化、getでの値の取得、for・forEach、ソートなどMapの使い方について詳しくしりたい方は、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
まとめ
MapからList、ListからMapへ変換する方法を一通り説明しました。
実際の業務でも、ここで説明したような変換処理が必要になることが度々ありますので、この機会にぜひ覚えておいてください。
もし、MapやListなどのコレクションの変換方法を忘れてしまったら、この記事を思い出してくださいね。