こんにちは、バナナドリームです。
前回はListからMapを作る基本パターンを解説しました。
今回は「Mapから値を取り出す」ときの安全な書き方がテーマです。
何も考えずに get() するだけでは、思わぬバグの原因になることがあります。
実務でよく使うパターンを順に押さえていきましょう。
get()だけでは危ない理由
Mapから値を取り出すとき、まず思い浮かぶのは get() です。
Map<String, String> map = new HashMap<>();
map.put("001", "Taro");
System.out.println(map.get("001")); // → Taro
System.out.println(map.get("999")); // → null存在するキーなら値が返りますが、存在しないキーを渡すと null が返ります。
ここで返ってきた null をそのまま後続の処理に使ってしまうと、NullPointerException が発生する可能性があります。
String name = map.get("999");
System.out.println(name.length()); // → NullPointerException!このように、get() の結果を使う前に「値が存在するかどうか」を確認する習慣が重要です。
containsKey()で存在チェックをする
キーが存在するかどうかを事前に確認するには containsKey() を使います。
Map<String, String> map = new HashMap<>();
map.put("001", "Taro");
map.put("002", "Hanako");
String key = "003";
if (map.containsKey(key)) {
System.out.println(map.get(key));
} else {
System.out.println("該当するデータが見つかりませんでした");
}
// → 該当するデータが見つかりませんでしたcontainsKey() は指定したキーがMapに存在すれば true、なければ false を返します。
if文と組み合わせることで、存在しないキーへの get() を防げます。
ユーザー入力をキーにして検索する場面や、外部から受け取ったデータを扱う場面では、このパターンが特に重要です。
getOrDefault()でデフォルト値を返す
「キーがなければデフォルト値を使いたい」という場面には、getOrDefault() が便利です。
containsKey() + get() の組み合わせをより簡潔に書けます。
Map<String, Integer> scores = new HashMap<>();
scores.put("Taro", 85);
scores.put("Hanako", 92);
int score = scores.getOrDefault("Jiro", 0);
System.out.println(score); // → 0第1引数がキー、第2引数がキーが存在しなかったときに返すデフォルト値です。
キーが存在しない場合にデフォルト値を使いたい場面や、『未登録なら0点として扱う』『未設定なら空文字にする』といった処理をシンプルに書けます。
ただし、キーが存在していて値が null の場合は null が返る点には注意しましょう。
containsKey()とgetOrDefault()の使い分け
どちらを使うかは「キーがない場合に何をしたいか」で決まります。
キーがない場合に別の処理をしたいときは、containsKey() + if文 が向いています。
キーがない場合にデフォルト値で済ませたいときは、getOrDefault() が向いています。
例えば「キーが存在しない場合にエラーログを出してreturnしたい」なら containsKey()
「未登録ユーザーには初期ポイントの0を使えばいい」なら getOrDefault() が自然な選択です。
nullを値として格納している場合の注意
少し応用的な話ですが、Mapにはnullを値として put() することも可能です。このとき get() の結果だけでは「キーが存在しないのか」「値がnullなのか」を区別できません。
Map<String, String> map = new HashMap<>();
map.put("001", null);
System.out.println(map.get("001")); // → null
System.out.println(map.get("999")); // → null(どちらも同じ結果)この2つを区別したい場合は containsKey() が必要です。
if (map.containsKey("001")) {
System.out.println("キーは存在する(値はnullかもしれない)");
} else {
System.out.println("キー自体が存在しない");
}実務では意図的にnullを値として格納するケースは多くありませんが、外部から受け取ったMapを扱う場合はこの違いを意識しておくと安全です。
Stream APIを使った存在確認
MapのキーをStream処理で扱いたい場面では、keySet() を使ってキーの集合を取り出せます。
Map<String, String> map = new HashMap<>();
map.put("001", "Taro");
map.put("002", "Hanako");
boolean exists = map.keySet().stream()
.anyMatch(key -> key.startsWith("00"));
System.out.println(exists); // → true完全一致ではなく「特定の条件を満たすキーが存在するか」を調べたい場合に有効です。
通常の存在確認には containsKey() で十分ですが、こうした柔軟な検索が必要になったときの選択肢として覚えておくと便利です。
まとめ
・et() はキーが存在しない場合に null を返すため、後続処理でのNullPointerExceptionに注意
・containsKey() でキーの存在を事前確認するのが安全な基本パターン
・デフォルト値で代替できる場面では getOrDefault() を使うと簡潔に書ける
・nullが値として格納されているケースでは get() だけでは判断できないため containsKey() で区別する
・条件付きのキー検索には keySet().stream() と anyMatch() が使える
次回:「Mapのループ処理:全エントリを操作するentrySet・keySet・values」
Mapの中身を一括で処理したい場面では、ループが欠かせません。
次回は entrySet()・keySet()・values() それぞれの特徴と使い分けを、実務的なコード例とともに解説します。
有限会社バナナドリーム
千葉県浦安市を拠点に、Javaを中心としたシステム開発からITコンサルタント、Webサイト制作まで幅広く手がけるシステム開発会社です。
開発・実装からアフターフォローまで一貫して対応し、お客様の課題に寄り添ったきめ細やかなサービスを提供しています。
「やさしさがつなぐ、人と未来と技術。」を掲げ、技術力だけでなく人と人とのつながりを大切にした経営を実践。
社員一人ひとりの個性を尊重し、30名規模を上限とした少数精鋭体制のもと、社員・顧客・地域社会のすべてと良好な関係を築くことを理念としています。
「Realize Dream ~夢は実現する為にある~」という言葉のもと、関わるすべての人の夢の実現をサポートし続けます。

