ENTRANCE

都内でエンジニアやってます。主にRubyとJavaを書いて遊んでる人のブログ。楽しくのんびりとがモットー。

【Java】Optionalとは仲良くした方がいいよって話

こんにちは、かっつんです!

Java8でOptionalが導入されて久しいですが、Optionalと仲良くできていますか?

私は好きです、非常に。何ならなんでもOptionalにしてしまいがちなくらい好きです、、、

で、Optionalってなんなのさ?

ドキュメントによると、

null以外の値が含まれている場合も含まれていない場合もあるコンテナ・オブジェクトです。

引用: Optional (Java Platform SE 8)

うん、言いたいことはなんとなくわかりますね、、、

あるかないかわからないからOptionalさんがラップして代わりに表現してくれるということみたいですね。


え、nullチェックしたらよくね?

nullかもしれない値が渡ってくるならnullチェックすればいんじゃね?

わざわざOptionalとか言うよくわからんやつ使うのなんてめんどくさいだけじゃん。って思いません?

私もここまでの話だけならそう思います。実際に事足りますしね。。。

でもここからがOptionalさんの本当の力の見せ所なんです!

例えば次のような処理を行いたいとき

1 DBからIDで果物名を取得
2 #1で果物名が取得できたら、「"私は#{果物名}+が大好きです"」という文字列に加工して返却する。
   取得できなかった場合は、「"果物食べたいな〜"」という文字列を返却する。

Optionalを使わない場合

public String getFruits(Long id) {
    String name = findById(id); // findByIdの戻り値はString型
    if (name == null) {
        returen "果物食べたいな〜";
    }
    returen "私は" + name + "が大好きです";
}

Optionalを使った場合

public String getFruits(Long id) {
     // findByIdの戻り値はOptional<String>
    returen findById(id).map(name -> "私は" + name + "が大好きです")
        .orElse("果物食べたいな〜");
}

ん!???何とも簡潔、、、

(画面幅の都合で改行してますが)ワンライナー、、、素晴らしい。

少しだけ、Optionalを使った場合の解説をすると、

findById(id)の中身があった時は、.map()内の処理が実行され、

中身がなかった時は.orElse()内の処理が実行されるのです。

このコードの可読性もさることながら、

Optionalの一番のメリットはやはりnullを気にしなくて良いこれに尽きると思います(個人的に)


ってことは、もうnullを恐れなくていいのか!!

そうです! ヌルポを出して、ガッ!ってされていた時代はもう古き良き時代の産物として、明日からみんなOptional使ってね。


他にも色々なメソッドとかあるから紹介しておくコーナー

  • Optional.of()Optional.ofNullable()使えばOptional型に変換できるよ!

  • Optionalが空っぽの時は、nullじゃなくて、Optional.empty()だよ!

  • .orElse()以外にも、.orElseGet()使えば

.orElseGet(() -> {
    Fruits fruits = new Fruits();
    fruits.setName("オレンジ");
    returen fruits;
})

のようにインスタンスを返却したり、

.orElseThrow()使えば

.orElseThrow(() -> new RuntimeException("該当するフルーツがないよ"));

みたいに例外を投げることも可能だよ!

  • isPresent()を使えば中身があればtrue、なければfalseのbool値を返してくれるよ!

  • ifPresent()を使うと中身がある場合に、処理が行えるよ。戻り値はvoidだよ!

最後に

Optional型で取得したのに、即get()したらあかんからね!!!