Java8入門:Optionalの使い方・使い所

Java Logo

Java 6以降、Javaの勉強をサボっていたので、Java7とJava8を勉強している。今回は、Optionalの使い方・使い所を学んだ。

Optionalは、Null か 値のどちらかが入っているクラスである。Nullオブジェクトパターンと似ているなと感じた。

使い方

Optionalを生成するメソッド。普通はofNullableを使うんだろうと思う。

メソッド名 説明
empty() 空のOptional
ofNullable(T value) Nullを許容するOptional
of(T value) Nullを許容しないOptional

値を取得するメソッド。orElseをメインで使っていく。

メソッド名 説明
get() 保持している値を返す。値がなければ例外が発生
orElse(T value) 保持している値を返す。値がなければ引数の値を返す
orElseGet(Supplier<? extends T> other) 保持している値を返す。値がなければラムダ式で生成した値を返す

その他のメソッド。

メソッド名 説明
isPresent() 説明値を保持しているかどうか
ifPresent(Consumer<? super T> consumer) 値を保持しているときのみ引数のラムダ式を実行
filter(Predicate<? super T> predicate) 条件に合致した場合のみ値を返す
map(Function<? super T,? extends U> mapper) 値を保持している場合のみ値を処理する
flatMap(Function<? super T,Optional> mapper) 値の返還と平坦化を行う

参考リンク

サンプルソース その1

public static void sample1() {
//int[] numbers = {1, 2, 3};
  int[] numbers = {};
  OptionalDouble aveOption = Arrays.stream(numbers).average();
  double average = aveOption.orElse(0);
  if (aveOption.isPresent()) {
    System.out.println("値が存在します。");
  } else {
    System.out.println("値が存在しません。");
  }
  System.out.println("average = " + average);
}

実行結果

sample1
値が存在しません。
average = 0.0

サンプルソース その2

public static void sample2() {
  Optional<String> op = Optional.empty();
  // 値が存在する場合のみ出力する
  op.ifPresent(s -> System.out.println(s));

  Optional<String> op2 = Optional.ofNullable("ofNullable method.");
  // 値が存在する場合のみ出力する
  op2.ifPresent(s -> System.out.println(s));

  Optional<String> op3 = Optional.ofNullable(null);
  // 値が存在する場合のみ出力する
  op3.ifPresent(s -> System.out.println(s));

  // nullを入れるとヌルポ
  //Optional<String> op4 = Optional.of(null);
  Optional<String> op4 = Optional.of("of method.");
  // 値が存在する場合のみ出力する
  op4.ifPresent(s -> System.out.println(s));
}

実行結果

sample2
ofNullable method.
of method.

使い所

思いつく感じだと以下の2点かな。

  • メソッドの戻り値
  • Nullチェックで、処理を切り分けているところ

Scalaを読める人向けだけど、以下の記事も参考になる。
ScalaのOptionステキさについてアツく語ってみる - ( ꒪⌓꒪) ゆるよろ日記

今までJavaDocでしか、メソッドの戻り値にnullが入ることを知らせることができなかった。例えばHashMapのgetメソッドなど。そこをOptionにすることで、メソッドの利用者にnullが入る可能性を知らせることができる。

値がない可能性があるところがOptionになっていれば、mapやflatmapを使って、if文を書かずに処理を継続できる。Streamクラスと一緒に使えば、非常に便利に使うことができそうだ。

今回のサンプルソース
Sample/Main.java at master · eiKatou/Sample