Mapの存在チェック
こんにちは。島根と言えば出雲蕎麦ですが、15時くらいには閉まるので行かれる方はお昼がおすすめです。
さて、今日は自分的に 結構良いんじゃないかなあ!? と思う処理を思いついたので、どっかで使うためにおいておきます。
使い所はよくわかってません。
追記
@yoshi389111 さんに頂いたアドバイスの内容を追記しました。
コード3
コード
普通?というか単純な私がぱっと思いつくのはこんなコードです。
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("thx", "Thank you");
map.put("azs", "Azasu");
System.out.println(mapCheck(map));
}
private static Boolean mapCheck(Map<String, String> map) {
Boolean exist = true;
if (!map.containsKey("thx")) {
exist = false;
}
if (!map.containsKey("azs")) {
exist = false;
}
return exist;
}
実行結果 -> true
別にこれで悪いわけじゃないと思うのですが、今回思いついたのは以下のコードです。
コード2
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("thx", "Thank you");
map.put("azs", "Azasu");
System.out.println(mapCheck(map));
}
private static Boolean mapCheck(Map<String, String> map) {
// 必須のKeyの存在チェック結果を追加
List<Boolean> list = new ArrayList<Boolean>(){
{
add(map.containsKey("thx"));
add(map.containsKey("azs"));
}
};
// false の存在チェック結果を返却
return !list.contains(false);
}
実行結果 -> true
"thx", "azs" はmapにあるので true になりました。
次に map に存在しない値をリストに追加してみます。
private static Boolean mapCheck(Map<String, String> map) {
// 必須のKeyの存在チェック結果を追加
List<Boolean> list = new ArrayList<Boolean>(){
{
add(map.containsKey("thx"));
add(map.containsKey("azs"));
add(map.containsKey("danke"));
}
};
// false の存在チェック結果を返却
return !list.contains(false);
}
実行結果 -> false
"danke"はmapにないので false が返ってきました。
今後に期待
どうでしょう?
もし値が増えても add を増やすだけでいいので、視線移動が少なくて良いのかなと思います。
また、これは Map でなくても add に Boolean を返す処理を書けば流用できるので、利便性もそんなに変わらないんじゃない?ってとこもオキニです。
特定の値がない場合は処理を終了させたいときにも有効ですし、この処理を挟めば後続の処理では存在チェックをする必要がなくなります。
と、いろいろ書いてみましたが これだ!! という活用方法は自分自身浮かんでないのでこの子の未来に期待します。
コード3
・List.of()
を使用してインスタントにリストを生成する方法
・containsAll()
を使用してリストの値をまとめて検索する方法
を紹介していただきました。かなりスッキリして感動です
private static boolean mapCheck(Map<String, String> map) {
return map.keySet().containsAll(List.of("thx", "azs"));
}
keySet()
で取得したキーの一覧に、List.of()
で生成した存在確認したいキーの一覧が含まれているかをcontainsAll()
を使ってまとめてチェックするという方法です。
キーの一覧に対して存在チェックをしたいということが各メソッド名でわかりやすくなりましたし、スッキリ書くことができました!
Boolean型とboolean型についても勉強になりました
また、直接関係ないですが Boolean はラッパークラスで無駄なオートボクシングが発生するので、今回のメソッドの戻り値としてはプリミティブ型の boolean の方が良いと思います
参考
-- @yoshi389111