本日も実務の実装の中で、学んだことがあったので備忘録として書き残しておこうと思います。
人知れず変数の中に入ってしまうnullの対処についてです。
Java歴の浅い方や古いバージョン(8以前)を中心に実装していた方もためになるかと思います。
僕の知っていたnullチェック
僕が研修などで学んだチェックは一般的な以下でした。
String a = null;
String b = "あいう";
if (a != null) {
System.out.print(a);
} else {
System.out.print(b); //こっちが実行される
}
!= または == これで比較してif文の分岐でヌルポで落ちないようにすることしか知りませんでした。
今でもシステム内では結構使われていましたが、、、
推奨されるnullチェック
nullの考慮ができるメソッドやOptionalを利用することで、nullチェックの数は減るとは思いますが、
どうしてもnullチェックをしたい時があります。
そんな時にjava8以降で推奨されるnullチェックは以下です。
String a = null;
String b = "あいう";
if (Objects.nonNull(a)) {
System.out.print(a);
} else {
System.out.print(b); //こっちが実行される
}
ObjectsクラスのnonNullメソッドは、!=nullと同じ役割を果たします。
== nullの判定と同じメソッドも用意されています。
それが下記で、ObjectsクラスのisNull()メソッドです。
String a = null;
String b = "あいう";
if (Objects.isNull(a)) {
System.out.print(b);//こっちが実行される
} else {
System.out.print(a);
}
Objectsクラスのメソッドを利用するメリット
メリット①:!=や==と記述するより可読性が上がる。
メリット②:関数型プログラミングで利用しやすい、見やすい
メリット②についてですが、streamAPIにて中間操作でnullのデータを破棄したい時に利用できます。
クラス名::メソッド名 もしくは、インスタンス名::メソッド名で利用できます。
List list = Arrays.asList(1,null,2,null);
List<Integer> result = list.stream().filter(Objects::nonNull).collect(Collectors.toList());
//resultの中身は[1,2]のみになる
可読性が上がるかつ簡潔に記載ができるのが良いですよね。
nullチェックをする時はObjectクラスを利用してくように心がけます。