こんにちは、バナナドリームです。
前回はListのフィルタリングについて解説しました。
今回はデータ管理の幅をぐっと広げる「Map」がテーマです。
Listとの違いを押さえながら、「ListからMapを作る」実践的なパターンを順に見ていきましょう。
MapとListの違い
Listは要素を「順番」で管理します。取り出すときは get(0) のようにインデックスを使います。
一方、Mapは「キーと値のペア」で管理するデータ構造です。インデックスの代わりに自分で決めたキー(名前やIDなど)を使って値を取り出せます。
List → [0]:"Taro" [1]:"Hanako" [2]:"Jiro"
Map → "001":"Taro" "002":"Hanako" "003":"Jiro"「3番目の人は誰?」ならListが向いていますが、「IDが002の人は誰?」という検索にはMapが圧倒的に便利です。
Mapの基本的な使い方
まずMapの操作を単体で確認しておきましょう。よく使う実装クラスは HashMap です。
Map<String, String> map = new HashMap<>();
map.put("001", "Taro");
map.put("002", "Hanako");
map.put("003", "Jiro");
System.out.println(map.get("002")); // → Hanakoput(キー, 値) で追加、get(キー) で取り出します。存在しないキーで get() すると null が返るため、取り出し後の処理では null チェックを忘れないようにしましょう。
ListからMapを作る:基本パターン
V実務では「Listで受け取ったデータを、IDをキーにして引けるようにしたい」という場面がよくあります。foreachループと put() を組み合わせるのが基本です。
ここでは、IDと名前をフィールドに持つ User クラスを例に使います。
class User {
String id;
String name;
User(String id, String name) {
this.id = id;
this.name = name;
}
}List<User> users = new ArrayList<>();
users.add(new User("001", "Taro"));
users.add(new User("002", "Hanako"));
users.add(new User("003", "Jiro"));
Map<String, User> userMap = new HashMap<>();
for (User user : users) {
userMap.put(user.id, user);
}
System.out.println(userMap.get("002").name); // → Hanakoループの中で「何をキーにするか」を決めて put() するだけです。IDでも名前でも、用途に合ったフィールドをキーに選べます。
値を文字列など一部のフィールドにする
Mapの値はオブジェクト全体でなくても構いません。「IDから名前だけ引ければいい」という場合は、値を String にしてフィールドを直接格納する方法がシンプルです。
Map<String, String> nameMap = new HashMap<>();
for (User user : users) {
nameMap.put(user.id, user.name);
}
System.out.println(nameMap.get("001")); // → Taro用途に応じてMapの型を変える柔軟さが、実務での使いやすさにつながります。
キーの重複に注意する
Mapはキーの重複を許しません。同じキーで put() すると、後から入れた値で上書きされます。
Map<String, String> map = new HashMap<>();
map.put("001", "Taro");
map.put("001", "Saburo"); // 上書きされる
System.out.println(map.get("001")); // → SaburoListからMapを作るとき、キーに使うフィールドが一意(ユニーク)であることを事前に確認しておきましょう。
IDや社員番号など、重複しない値をキーに選ぶのが基本です。名前など重複しうるフィールドをキーにすると、データが意図せず失われることがあります。
Stream APIを使った書き方
Java 8以降では、Collectors.toMap() を使ってListからMapへの変換をより簡潔に書けます。
import java.util.stream.Collectors;
Map<String, User> userMap = users.stream()
.collect(Collectors.toMap(user -> user.id, user -> user));
System.out.println(userMap.get("003").name); // → Jiro第1引数がキーの取り出し方、第2引数が値の取り出し方をラムダ式で指定しています。
ただし、キーが重複していると IllegalStateException が発生するため、データの性質を把握してから使いましょう。
MapをループしてListに戻す
変換は一方向だけではありません。Mapのすべてのエントリをループするときは entrySet() を使います。
for (Map.Entry<String, User> entry : userMap.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue().name);
}
// → 001 : Taro
// → 002 : Hanako
// → 003 : JirogetKey() でキー、getValue() で値を取り出せます。MapからListに戻したい場合は、このループの中で add() すればOKです。
まとめ
・MapはListと異なり「キーと値のペア」でデータを管理する
・foreachループ + put() の組み合わせがListからMapへの変換の基本
・Mapの値はオブジェクト全体でも、特定のフィールドだけでも用途に合わせて選べる
・キーの重複には要注意。一意なフィールドをキーに使う
・慣れてきたら Collectors.toMap() も選択肢に
次回:「MapのgetとcontainsKeyで安全に値を取り出す方法」
Mapから値を取り出すとき、キーが存在しない場合は null が返ります。
containsKey() による存在チェックや getOrDefault() を使った安全な取り出し方など、実務で役立つパターンを解説します。
有限会社バナナドリーム
千葉県浦安市を拠点に、Javaを中心としたシステム開発からITコンサルタント、Webサイト制作まで幅広く手がけるシステム開発会社です。
開発・実装からアフターフォローまで一貫して対応し、お客様の課題に寄り添ったきめ細やかなサービスを提供しています。
「やさしさがつなぐ、人と未来と技術。」を掲げ、技術力だけでなく人と人とのつながりを大切にした経営を実践。
社員一人ひとりの個性を尊重し、30名規模を上限とした少数精鋭体制のもと、社員・顧客・地域社会のすべてと良好な関係を築くことを理念としています。
「Realize Dream ~夢は実現する為にある~」という言葉のもと、関わるすべての人の夢の実現をサポートし続けます。
