javaでlistをmapに変換する方法
プログラミング言語Javaでは、コレクションというデータ構造を扱うためのフレームワークが提供されています。
この記事では、「JavaでListをMapに変換する方法」について詳しく解説します。
初心者から中級者まで、実践的なコード例とその出力結果を交えて、わかりやすく説明します。
1. Java8のStreamを利用した変換
Java8から導入されたStream APIを使用すると、リストからマップへの変換を簡単に行うことができます。
以下に、Streamを使用してListをMapに変換する簡単な例を示します。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import java.util.*; import java.util.stream.*; public class Program { public static void main(String[] args) { List list = Arrays.asList("Apple", "Banana", "Cherry"); Map<Integer, String> map = list.stream() .collect(Collectors.toMap( item -> item.length(), item -> item )); System.out.println(map); } } |
出力結果
{5=Apple, 6=Banana, 6=Cherry}
KindleUnlimited会員であれば、全ての本をご覧頂けます。 StreamAPIを理解すれば、Javaの世界が変わる 第1版
2. Java8のStreamを利用した変換(複雑な例)
次に、より複雑なリストからマップへの変換を考えてみましょう。
この例では、オブジェクトのリストをマップに変換します。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.util.*; import java.util.stream.*; public class Program { static class Fruit { private String name; private String color; Fruit(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public String getColor() { return color; } } public static void main(String[] args) { List list = Arrays.asList( new Fruit("Apple", "Red"), new Fruit("Banana", "Yellow"), new Fruit("Cherry", "Red") ); Map<String, String> map = list.stream() .collect(Collectors.toMap( Fruit::getName, Fruit::getColor )); System.out.println(map); } } |
出力結果
{Apple=Red, Banana=Yellow, Cherry=Red}
3. グループ化を利用した変換
リストからマップへの変換時に、同じキーを持つ要素をグループ化することも可能です。
以下の例では、色ごとにフルーツをグループ化します。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
import java.util.*; import java.util.stream.*; public class Program { static class Fruit { private String name; private String color; Fruit(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public String getColor() { return color; } } public static void main(String[] args) { List list = Arrays.asList( new Fruit("Apple", "Red"), new Fruit("Banana", "Yellow"), new Fruit("Cherry", "Red") ); Map<String, List> map = list.stream() .collect(Collectors.groupingBy( Fruit::getColor, Collectors.mapping(Fruit::getName, Collectors.toList()) )); System.out.println(map); } } |
出力結果
{Red=[Apple, Cherry], Yellow=[Banana]}
4. マップへの変換時に既存のキーを上書きする
デフォルトでは、マップへの変換時に既存のキーと同じキーを持つ要素があると、例外がスローされます。
しかし、Collectorのオーバーロードされたバージョンを使えば、新しい要素によって既存のキーを上書きすることができます。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import java.util.*; import java.util.stream.*; public class Program { static class Fruit { private String name; private String color; Fruit(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public String getColor() { return color; } } public static void main(String[] args) { List list = Arrays.asList( new Fruit("Apple", "Red"), new Fruit("Banana", "Yellow"), new Fruit("Cherry", "Red"), new Fruit("Strawberry", "Red") ); Map<String, String> map = list.stream() .collect(Collectors.toMap( Fruit::getColor, Fruit::getName, (oldValue, newValue) -> newValue )); System.out.println(map); } } |
出力結果
{Red=Strawberry, Yellow=Banana}
5. マップの値に対する操作
マップの値に対して特定の操作を行いたい場合もあります。
そのような場合は、各要素をマップに変換する際に指定する関数に操作を追加します。
次の例では、マップの値を大文字にします。
ソースコード例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
import java.util.*; import java.util.stream.*; public class Program { static class Fruit { private String name; private String color; Fruit(String name, String color) { this.name = name; this.color = color; } public String getName() { return name; } public String getColor() { return color; } } public static void main(String[] args) { List list = Arrays.asList( new Fruit("Apple", "Red"), new Fruit("Banana", "Yellow"), new Fruit("Cherry", "Red"), new Fruit("Strawberry", "Red") ); Map<String, String> map = list.stream() .collect(Collectors.toMap( Fruit::getColor, fruit -> fruit.getName().toUpperCase() )); System.out.println(map); } } |
出力結果
{Red=STRAWBERRY, Yellow=BANANA}
javaでmapからlistへ変換する方法
Java 8以降、Stream APIはコレクション操作の強力なツールとして登場しました。Mapの各エントリをListに変換する際にも、Stream APIは非常に便利です。
Stream APIを使った変換例
ソースコード例: Stream APIを使ったMapからListへの変換
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.*; import java.util.stream.Collectors; public class Program { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Apple"); map.put(2, "Banana"); map.put(3, "Cherry"); List list = map.values().stream().collect(Collectors.toList()); System.out.println(list); } } |
このコードでは、Mapのvalues()
メソッドを使用して値のコレクションを取得し、Stream APIのcollect()
メソッドを使ってListに変換しています。
出力結果
[Apple, Banana, Cherry]
forループを使用した変換例
Stream API以外にも、MapをListに変換する方法はいくつか存在します。
Java8より前のバージョンでは、StreamAPIは使用できないので、forループを使用し、変換することになると思います。
ソースコード例: forループを使ったMapからListへの変換
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import java.util.*; public class Program { public static void main(String[] args) { Map<Integer, String> map = new HashMap<>(); map.put(1, "Apple"); map.put(2, "Banana"); map.put(3, "Cherry"); List list = new ArrayList<>(); for (String value : map.values()) { list.add(value); } System.out.println(list); } } |
この例では、forループを使用してMapの値を一つずつListに追加しています。
出力結果
[Apple, Banana, Cherry]
まとめ
まとめ
Javaのリストからマップ、マップからリストへの変換は、プログラムをする上でよく使用する便利な方法です。
今回は、JavaのStream API、Collectorsクラス、ループを使った方法を見てきましたが、他にもさまざまな方法が存在します。
これを機に、Javaのリストとマップをうまく使いこなすことで、より良いコードを書くことができるようになってみてはいかがでしょうか。
最後まで読んで頂き、ありがとうございました。少しでもお役にたてたなら幸いです!