Java 8 Optional完全ガイド:実践的なNull安全コードの書き方
Optionalは、nullでないオブジェクトを格納するためのコンテナオブジェクトです。Optionalオブジェクトは、値が存在しない状態を表現するために使用されます。このクラスには、nullチェックを行う代わりに、値を「利用可能」または「利用不可」として扱うためのさまざまなユーティリティメソッドが用意されています。Java 8で導入され、GuavaのOptionalと同様の機能を提供します。
クラス宣言
以下はjava.util.Optional<T>クラスの宣言です:
public final class Optional<T> extends Object
クラスメソッド
| 番号 | メソッドと説明 |
|---|---|
| 1 | static <T> Optional<T> empty() 空のOptionalインスタンスを返します。 |
| 2 | boolean equals(Object obj) 他のオブジェクトがこのOptionalと「等しい」かどうかを示します。 |
| 3 | Optional<T> filter(Predicate<? super T> predicate) 値が存在し、その値が指定された述語と一致する場合、その値を記述するOptionalを返し、そうでない場合は空のOptionalを返します。 |
| 4 | <U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper) 値が存在する場合、提供されたOptionalを返すマッピング関数を適用し、その結果を返します。値が存在しない場合は空のOptionalを返します。 |
| 5 | T get() このOptionalに値が存在する場合、その値を返し、そうでない場合はNoSuchElementExceptionをスローします。 |
| 6 | int hashCode() 値が存在する場合はその値のハッシュコードを、存在しない場合は0を返します。 |
| 7 | void ifPresent(Consumer<? super T> consumer) 値が存在する場合、指定されたコンシューマをその値で呼び出し、存在しない場合は何もしません。 |
| 8 | boolean isPresent() 値が存在する場合はtrueを、そうでない場合はfalseを返します。 |
| 9 | <U> Optional<U> map(Function<? super T, ? extends U> mapper) 値が存在する場合、提供されたマッピング関数を適用し、結果がnullでない場合はその結果を記述するOptionalを返します。 |
| 10 | static <T> Optional<T> of(T value) 指定された非null値を持つOptionalを返します。 |
| 11 | static <T> Optional<T> ofNullable(T value) 指定された値が非nullの場合はその値を記述するOptionalを、nullの場合は空のOptionalを返します。 |
| 12 | T orElse(T other) 値が存在する場合はその値を、存在しない場合はotherを返します。 |
| 13 | T orElseGet(Supplier<? extends T> other) 値が存在する場合はその値を、存在しない場合はotherを呼び出し、その呼び出しの結果を返します。 |
| 14 | <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) 値が存在する場合はその値を返し、存在しない場合は提供されたサプライヤによって作成される例外をスローします。 |
| 15 | String toString() デバッグに適した、空でないこのOptionalの文字列表現を返します。 |
このクラスは以下のクラスからメソッドを継承しています:
- java.lang.Object
Optionalの使用例
任意のエディタで以下のJavaプログラムを作成してください(例:C:\> JAVA)。
Java8Tester.java
Live Demoimport java.util.Optional;
public class Java8Tester {
public static void main(String args[]) {
Java8Tester java8Tester = new Java8Tester();
Integer value1 = null;
Integer value2 = new Integer(10);
// Optional.ofNullable - 渡されたパラメータがnullでも許可される
Optional<Integer> a = Optional.ofNullable(value1);
// Optional.of - 渡されたパラメータがnullの場合、NullPointerExceptionをスロー
Optional<Integer> b = Optional.of(value2);
System.out.println(java8Tester.sum(a, b));
}
public Integer sum(Optional<Integer> a, Optional<Integer> b) {
// Optional.isPresent - 値が存在するかどうかをチェック
System.out.println("First parameter is present: " + a.isPresent());
System.out.println("Second parameter is present: " + b.isPresent());
// Optional.orElse - 値が存在する場合はその値を、存在しない場合はデフォルト値を返す
Integer value1 = a.orElse(new Integer(0));
// Optional.get - 値を取得、値が存在している必要がある
Integer value2 = b.get();
return value1 + value2;
}
}
実行結果の確認
javacコンパイラを使用してクラスをコンパイルします:
C:\JAVA>javac Java8Tester.java
Java8Testerを実行します:
C:\JAVA>java Java8Tester
以下の出力が生成されます:
First parameter is present: false Second parameter is present: true 10
Java
- Javaのfinalキーワード完全解説:変数、メソッド、クラスでの活用法
- Java instanceof演算子完全ガイド:基本から継承・インターフェースまで
- Java継承のマスター:概念、種類、実践例
- Java Staticネストクラスの理解:用法、違い、実例
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaシングルトンパターン完全解説:安全な実装と活用法
- Javaリフレクション完全ガイド:実行時のクラス・メソッド・フィールド検査
- Java ObjectOutputStream完全ガイド:シリアル化、メソッド、実践例
- Javaジェネリクス完全ガイド:再利用可能で型安全なコードの構築
- Javaファイル操作のマスター:java.ioによる作成・読み取り・書き込み・削除
- Java 9のOptionalクラス新機能:stream()、ifPresentOrElse()、or()