【Java学習|実務向け】Java 8以降の必須知識:Map.getOrDefaultでコードを劇的に簡潔にする方法

導入:なぜMap.getOrDefaultが重要なのか

実務でJavaを扱う際、Mapから値を取得して、もし存在しなければデフォルト値を設定するという処理は頻繁に発生します。従来のJava 7以前では、containsKeyで存在チェックをしてからgetを呼ぶ、あるいはtry-catchで例外処理を行うといった冗長なコードを書く必要がありました。
Java 8で導入された「Map.getOrDefault」は、この「値の取得とデフォルト値の設定」をわずか一行で実現します。コードの可読性を高めるだけでなく、ミスを減らし、ロジックをより宣言的に記述できるため、モダンなJava開発において必須のテクニックです。

基礎知識:Map.getOrDefaultとは

Map.getOrDefault(Object key, V defaultValue)は、指定されたキーがマップ内に存在する場合、そのキーに関連付けられた値を返します。もしキーが存在しない場合は、引数として渡したデフォルト値をそのまま返します。
このメソッドを利用することで、Mapから値を取得するたびにif文でnullチェックを行う必要がなくなります。特に、集計処理や設定値の取得など、値が空である可能性が高いシナリオで非常に強力です。

実装・解決策

実装のポイントは、戻り値がnullである可能性を考慮しつつ、ビジネスロジックをシンプルに保つことです。従来の「containsKeyによる判定」を排除することで、条件分岐のネスト(ifの深さ)を減らし、コードのメンテナンス性を向上させます。

サンプルプログラム

以下のコードは、商品の売上個数をカウントする集計処理の例です。Map.getOrDefaultを使うことで、初めて登場する商品に対してもスムーズにカウントアップを行っています。

import java.util.HashMap;
import java.util.Map;

public class MapExample {
public static void main(String[] args) {
// 商品ごとの売上数を格納するMap
Map salesMap = new HashMap<>();
salesMap.put(“Apple”, 10);
salesMap.put(“Banana”, 5);

String[] itemsSold = {“Apple”, “Orange”, “Apple”, “Banana”, “Orange”};

for (String item : itemsSold) {
// ポイント: 既存の値を取得し、なければ0をデフォルト値として使用
// getOrDefaultを使うことで、containsKeyチェックとif文が不要になる
int currentCount = salesMap.getOrDefault(item, 0);

// 値を更新して再格納
salesMap.put(item, currentCount + 1);
}

// 結果の出力
salesMap.forEach((key, value) ->
System.out.println(key + “: ” + value + “個”));
}
}

応用・注意点

現場で使う際に注意すべき点が二つあります。

一つ目は「デフォルト値の計算コスト」です。getOrDefaultの第2引数は、キーが存在してもしなくても毎回評価されます。もしデフォルト値の生成に重い処理(外部API呼び出しや複雑なインスタンス生成など)が必要な場合は、getOrDefaultではなく、Java 8のcomputeIfAbsentを利用することを検討してください。computeIfAbsentは、必要な時にだけ計算が行われる「遅延評価」が可能です。

二つ目は「null値の扱い」です。Mapがnullを値として許容する場合、Map内に明示的に「key = null」が登録されていると、getOrDefaultはデフォルト値ではなく「null」を返します。これは「キーが存在しない」場合と「値としてnullが格納されている」場合を区別できないことを意味します。この挙動が仕様上問題ないか、設計時に必ず確認してください。

これらの特性を理解し、適切に使い分けることで、より堅牢で美しいJavaコードを書くことができます。

コメント

タイトルとURLをコピーしました