nullチェックが話題になったので、Java 8のOptionalによるnullチェックを試してみる。

1年ほど前に書いたブログが、週末に発掘されて、少し拡散されていました。
nullチェックは、ifですべきかtry/catchですべきか?
このブログから1年経った今、自分は何をしているかというと、相変わらずifでnullチェックをしています。

Java 8でnullチェックはなくなる?

先日、こういうブログも書きました。
Java8で追加されたラムダ式を使ってみる!Mac OS X、Eclipse、Mavenへの導入から。
Javaの最新バージョンでは、様々な新しい記法が追加されています。会社では、まだJava8を実戦投入はしていないのですが、次のプロジェクトでは使うかもと思いながら、色々試しています。
以前はラムダ式について試していたんですが、今回nullチェックの話題が出たので、新しいOptionalクラスも試してみることにしました。
スクリーンショット 2014-09-22 21.54.20
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で一気に処理を記述する際などに、威力を発揮します。

タイトルとURLをコピーしました