Java
java8

JavaでNull安全なMapの値を取得する

本記事の目的

JavaではつきもののNull Pointer Exceptionですが、なるべく安全に値を取得したく、今回はMapの値の取得方法を試してみました。

検証の対象となるMap

Map<String, Boolean> map = new HashMap<String, Boolean>() {
  {
    put("true_label", true);
    put("false_label", false);
    put("null_label", null);
  }
};

普通にMap#get

assertTrue(map.get("true_label"));
assertFalse(map.get("false_label"));

assertNull(map.get("null_label"));
assertNull(map.get("invalid_label")); // Mapに存在しないキー

Java8のMap#getOrDefault

キーがなかった場合に代替値を取得することができます。

assertTrue(map.getOrDefault("true_label", false));
assertFalse(map.getOrDefault("false_label", false));
assertFalse(map.getOrDefault("invalid_label", false)); // キーがなかった場合の代替値を取得できます。

assertNull(map.getOrDefault("null_label", false)); // 残念ながらfalseにはなってくれない!!

Java8のOptional#ofNullable

assertTrue(Optional.ofNullable(map.get("true_label")).orElse(false));
assertFalse(Optional.ofNullable(map.get("false_label")).orElse(false));
assertFalse(Optional.ofNullable(map.get("null_label")).orElse(false)); // 代替値 falseになる
assertFalse(Optional.ofNullable(map.get("invalid_label")).orElse(false)); // 代替値 falseになる

Apache.commons.lang3のObjectUtils#defaultIfNull

Optionalでいいかもしれませんが念のため

assertTrue(ObjectUtils.defaultIfNull(map.get("true_label"), false));
assertFalse(ObjectUtils.defaultIfNull(map.get("false_label"), false));
assertFalse(ObjectUtils.defaultIfNull(map.get("null_label"), false)); // 代替値 falseになる
assertFalse(ObjectUtils.defaultIfNull(map.get("invalid_label"), false)); // 代替値 falseになる