本記事の目的
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になる