Optional
は Java 8 で導入されたコンテナクラスで、非null値を含む可能性があるオブジェクトを表します。主に NullPointerException
を回避し、よりエレガントなnull値処理を提供するために使用されます。以下は一般的な Optional
の使用例です。
Optional オブジェクトの作成
Optional.of(value)
:非null値を含む Optional
オブジェクトを作成します。
Optional.ofNullable(value)
:null値を含む可能性がある Optional
オブジェクトを作成します。
Optional.empty()
:空の Optional
オブジェクトを作成します。
Optional に値が含まれているかを確認
isPresent()
:Optional
に値が含まれている場合は true
を返します。
ifPresent(Consumer<? super T> action)
:Optional
に値が含まれている場合は、指定されたアクションを実行します。
Optional の値を取得
get()
:Optional
に値が含まれている場合はその値を返し、そうでない場合は NoSuchElementException
をスローします。
orElse(T other)
:Optional
に値が含まれている場合はその値を返し、そうでない場合はデフォルト値を返します。
orElseGet(Supplier<? extends T> other)
:Optional
に値が含まれている場合はその値を返し、そうでない場合は Supplier
を呼び出してその結果を返します。
orElseThrow(Supplier<? extends X> exceptionSupplier)
:Optional
に値が含まれている場合はその値を返し、そうでない場合は Supplier
によって提供される例外をスローします。
Optional の値を変換
map(Function<? super T, ? extends U> mapper)
:Optional
に値が含まれている場合はマッピング関数を適用し、新しい Optional
を返します。
flatMap(Function<? super T, Optional<U>> mapper)
:map と似ていますが、マッピング関数が Optional
を返し、Optional
がネストされません。
例
import java.util.Optional;
public class OptionalExamples {
public static void main(String[] args) {
// Optional オブジェクトの作成
Optional<String> nonEmptyOptional = Optional.of("Hello, World!");
Optional<String> nullableOptional = Optional.ofNullable(null);
Optional<String> emptyOptional = Optional.empty();
// Optional に値が含まれているかを確認
System.out.println("nonEmptyOptional is present: " + nonEmptyOptional.isPresent());
System.out.println("nullableOptional is present: " + nullableOptional.isPresent());
System.out.println("emptyOptional is present: " + emptyOptional.isPresent());
// Optional の値を取得
System.out.println("nonEmptyOptional value: " + nonEmptyOptional.get());
System.out.println("nullableOptional value or default: " + nullableOptional.orElse("Default Value"));
System.out.println("emptyOptional value or default: " + emptyOptional.orElse("Default Value"));
// ifPresent を使用して操作を実行
nonEmptyOptional.ifPresent(value -> System.out.println("Value is present: " + value));
// Optional の値を変換
Optional<Integer> lengthOptional = nonEmptyOptional.map(String::length);
System.out.println("Length of nonEmptyOptional value: " + lengthOptional.orElse(0));
// flatMap を使用してネストされた Optional を処理
Optional<Optional<String>> nestedOptional = Optional.of(Optional.of("Nested Value"));
Optional<String> flatMappedValue = nestedOptional.flatMap(opt -> opt);
System.out.println("FlatMapped value: " + flatMappedValue.orElse("No Value"));
}
}