【Java入門】MapとListの相互変換まとめ(key、valueのList化)

JavaのListやMapなどのコレクションは、Map→List、List→Mapへ変換することが可能です。

この記事では、そんなMapとListの変換方法について、以下の内容で解説していきます。

  • 【基礎】MapとListの違い
  • 【基礎】MapからListへ変換
  • 【基礎】ListからMapへ変換
  • 【発展】Java8のStreamを使う方法

今回はMapとListの変換について、さまざまな方法をわかりやすく解説します!

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の値を取得するラムダ式
));

詳しい説明については、こちらのサイトを参考にしてくださいね、

【Java入門】List⇔Map変換でJava8のStreamを使う方法
更新日 : 2017年9月6日

初期化、値の取得などMapについて知りたい!

初期化、getでの値の取得、for・forEach、ソートなどMapの使い方について詳しくしりたい方は、以下の記事にまとめていますので、ぜひ参考にしてくださいね!

【Java入門】Mapの使い方総まとめ(HashMapで初期化、値のソート)
更新日 : 2019年5月22日

まとめ

MapからList、ListからMapへ変換する方法を一通り説明しました。

実際の業務でも、ここで説明したような変換処理が必要になることが度々ありますので、この機会にぜひ覚えておいてください。

もし、MapやListなどのコレクションの変換方法を忘れてしまったら、この記事を思い出してくださいね。

「プログラミング、右も左もわからない…」という方にオススメ

当プログラミングスクール「侍エンジニア塾」では、これまで6000人以上のエンジニアを輩出してきました。

その経験を通してプログラミング学習に成功する人は、「目的目標が明確でそれに合わせた学習プランがあること」「常に相談できる人がそばにいること」「自己解決能力が身につくこと」この3つが根付いている傾向を発見しました。

侍エンジニア塾は上記3つの成功ポイントを満たすようなサービス設計に磨きをかけております。

cta_under_bnr

「自分のスタイルや目的に合わせて学習を進めたいな」とお考えの方は、ぜひチェックしてみてください。

書いた人

中沢 丈

フリーランスエンジニア。
システム開発からコンテンツ作成まで幅広く対応します。

連絡先はこちらです。
[email protected]

おすすめコンテンツ

まずはここから!初心者でも1から学べるプログラミング入門カリキュラム

転職成功で受講料0円!あなたもプログラミングを学んでエンジニアデビュー