[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 のような指定も可能