1年ほど前に書いたブログが、週末に発掘されて、少し拡散されていました。
nullチェックは、ifですべきかtry/catchですべきか?
このブログから1年経った今、自分は何をしているかというと、相変わらずifでnullチェックをしています。
Java 8でnullチェックはなくなる?
先日、こういうブログも書きました。
Java8で追加されたラムダ式を使ってみる!Mac OS X、Eclipse、Mavenへの導入から。
Javaの最新バージョンでは、様々な新しい記法が追加されています。会社では、まだJava8を実戦投入はしていないのですが、次のプロジェクトでは使うかもと思いながら、色々試しています。
以前はラムダ式について試していたんですが、今回nullチェックの話題が出たので、新しいOptionalクラスも試してみることにしました。
Optional (Java Platform SE 8 )
Optionalでnullチェックがなくなる、という前評判も聞いているので、見てみます。
Java 7のnullチェックの例
先に、Java 7の場合を紹介します。
$ java -version
java version "1.7.0_25"
次のようなメソッドを想定します。
public String findNameById(int id) {
return data.get(id);
}
深くは気にせずに、データアクセス層にこういうメソッドがあると想像して進めます。ユーザーIDから名前を取得するようなメソッドです。
仮に次のようなデータを登録しておきます。
data.put(1, "Taro");
data.put(2, "Hanako");
このデータは2件目までしか登録していないので、IDが3以上の場合はnullが返ります。
以上の準備をした上で、IDを順に見ていき、名前を表示していきます。名前が取得できなかった場合は表示しません。
for (int i = 1; i <= 10; i++) {
String name = app.findNameById(i);
if (name != null)
System.out.println("Hi " + name);
}
結果として、TaroとHanakoの名前が表示されます。
Hi Taro
Hi Hanako
if文のnullチェックで、IDが3以上のときの表示をしないように制御しています。
Java 8のOptionalを使うとどうなるか
今度は、Java 8にして、Optionalを使ってみます。
$ java -version
java version "1.8.0_11"
findNameByIdの実装を少し作り変えて、Optional
public Optional findNameById(int id) {
return Optional.ofNullable(data.get(id));
}
直接Stringを返すわけではないということです。
if文によるnullチェックと同じフローで処理をするとこんな感じです。
for (int i = 1; i <= 10; i++) {
Optional name = app.findNameById(i);
if (name.isPresent())
System.out.println("Hi " + name.get());
}
isPresentメソッドが値の存在確認になっていて、getメソッドが実際の値の取得処理になっています。
この処理は更に、ラムダ式も使って、次のように書くこともできます。
for (int i = 1; i <= 10; i++) {
app.findNameById(i).ifPresent(name -> {
System.out.println("Hi " + name);
});
}
ifPresentメソッドは、値の存在確認をした上で、存在した場合の処理を記述できます。ifPresentメソッドは、Consumerインタフェースを引数に受けるようになっているので、そこで表示処理を記述しています。
これだけだと何なのさ、という感じなんですが、Stream APIで一気に処理を記述する際などに、威力を発揮します。