Edited at

業務で役立ったJava No.1 Optional.ifPresentを使った時の戻り値

More than 1 year has passed since last update.

業務でJavaを書いていると何度も悩まされるのがnullチェックです。

でもいちいちStringUtilやCollectionUtilでチェックするのもめんどくさい

そもそも人が作ったインターフェースでnullが返ってくるかわからない。

なんて事ありますよね。。。

スムーズにかっこよく書きたいけどいまいち挙動が理解できなくてつまるところがあったので共有します。

(自分の実力不足なだけかもしれないですが)


Optionalで詰まったところ

Optional型のリストを受け取って特定の条件の時にOKだったりエラーコードを返したい。

普通にifを使えばいいんだけど、Optionalで受けちゃってるし、isPresentは御法度らしいのでうまいやり方はないか考えてました。

まず考えたのは

testList.ifPresent(c ->{

c.forEach(t -> {
if(t=="hoge") {
return "OK";
}
});
});

コンパイルエラー

なぜならifPresent,forEach共にConsumer型?であり、値を消費するしかできないからです。

戻り値を返すことはできません。

で考えたのが

List<String> test(Optional<List<String>> testList){

List<String> selectedList = new ArrayList<>();
testList.ifPresent(c ->{
c.forEach(t -> {
if(t=="hoge") {
selectedList.add("Ok");
}
});
});
return selectedList;
}

これで一応文字列のリストを返す事ができています。

戻り値がStringならget(0)をしてもらえば文字列を取れます。

が、言うまでもなく必要のない配列を作ってるのでクソです。

今回業務で使ったのはたまたまListの返却でよかったのですが、戻り値をStringで返さなければならない場合は素直にifを使うのが良さそうです。

ifPresentを使いながら単数の戻り値を返すいい方法あれば教えてください。

nullチェックめんどくさいから

規約でnullの可能性があるときは全部Optinalで返すことにしてほしいなあ・・・