技術と日常。

日々の気が付いたこと・気になったことを残しておきます。

[Java]Optional.ifPresent()/ifPresentOrElse()で戻り値がほしい時に読むページ

例えばメソッドの最後で、以下のように返したいとします。

  • Optionalがあるとき: 空じゃないよ!
  • Optionalが空の時: 空だよ!

普通に isPresent()で書くとこのようになります。

if (opt.isPresent()) {
    return "空じゃないよ!";
}
return "空だよ!";

以下のようには書けません。

return opt.ifPresent(o -> "空じゃないよ!").orElse("空だよ!");
return opt.ifPresentOrElse(o -> "空じゃないよ!", () -> "空だよ!");

これは、ifPresent()ifPresentOrElse()がvoidのためです(もっと言うと、中の引数もConsumer<? super T> action, Runnable emptyActionでvoid)。
引数には戻り値のない処理を書く必要があります。

条件分岐なしで、1行で返したい場合は、以下のように書きます。

return opt.map(o -> "空じゃないよ!").orElse("空だよ!");

初めて見ると一瞬戸惑いますが、Optional#map()値があれば変換結果を、なければ空のOptionalを返し ます。
そのため、orElseには空じゃないよ!か、空のOptionalが来るため、このような書き方が可能です。

ちなみに、空の時に例外を投げるときは、以下の書き方が可能です。

return opt.map(o -> "空じゃないよ!")
        .orElseThrow(); // 引数でNullPointerException::new のような指定も可能

参考

Optional (Java SE 17 & JDK 17)