LoginSignup
0
1

More than 3 years have passed since last update.

【Java】Optional覚書

Last updated at Posted at 2020-04-02

レガシーコードとは縁のないOptional

最近初めて業務で使ってうれしくなっちゃったので、次からも使えるように使用例のメモです。

2019年の完全新規案件でJava1.6を強制されることのある現場に在籍しています。
この期に及んでJava8に触れる機会があまりありません。
そんな中で「Java8からはnullチェックが簡単に書けるらしい」というJava8登場時に聞いた情報で書きました。
一応複数のサイトを確認して書いていますが、マサカリとか改善方法とかがありましたら、ぜひコメントをお願い致します。
(私のコードレビューが可能なレビュアーが案件に不在のため)(他のメンバーのレビューは私がしています)

getについて

使いどころがわからなかったので、使っていません。
いくつかサイトを見ると「get使うな論」を見かけたので、逆に正解だったのでは?感ある。

注意

「Optionalは単純に従来のnullチェックを置換できる」は正しい認識ではありませんでした。
「Optionalを使うとnullチェック忘れの可能性撲滅のためにnullチェックを強制できる」が正しいですね…
なのでサンプルコードは動きますが、Optionalの使い方としては正しい認識のもと書かれたコードではありません。
忘れないためにこの記事は削除せずに残しますが、「Optional初めて~!」な私みたいな方は引っかからないようにお気を付けください。
@sikani さん、ありがとうございました!やっぱり有識者にレビューしてもらわないとダメだ…
Optionalで書くことを他人のレビュー指摘で挙げてなかったのが不幸中の幸い。(Java8っぽいコードを強制されない案件なので)

サンプルコード

Java1.6はわざとアレな書き方をしています。Java8はすっきり書けますね:relaxed:
Java8の方はちょっと使い方間違ってるけど。
Java1.6でも三項演算子でワンライナーで書けますけどもね…retは無駄なだけだしアーリーリターンすらもせずにif~else使うしprivateメソッドも切らないで毎回if文書いてるタイプの現場でまじイケてないレガシーコードが大半なので、リファクタリングでいつも心が死ぬ。更に言うとJava8使ってもJava1.6の書き方そのままのメンバー多すぎて最早笑う。自分を意識高い系と誤解しそうになるので困る…最近賑わってた格上格下論争を思い出します。愚痴ですまない。

Java1.6
public String toStringIfNotNull(final Object obj) {
    String ret;
    if (obj == null) {
        ret = null;
    } else {
        ret = obj.toString();
    }
    return ret;
}
Java8
public String toStringIfNotNull(final Object obj) {
    return Optional.ofNullable(obj).map(Object::toString).orElse(null);
}

nullチェックの代わりにOptionalを使うなら、ofよりもofNullableorElseの組み合わせが最適解なのではないかな!?という印象。
nullじゃなければ元の値をそのまま返すのであれば、mapとか中間処理?が不要になるだけですし。

mapの他には、filterflatMapがあります。
filterはnullとfilter結果がfalseの場合にorElseの引数が返ります。
flatMapはnullの場合はorElseの引数が返りますが、flatMap処理の結果がnullの場合、NullPointerExceptionがスローされます。(mapの場合は処理結果がnullでもorElseの引数が返る)

nullかどうかで値を返すのではなく処理を分岐する場合は、if (Optional.ofNullable(obj).isPresent())って書けば大丈夫らしいぞ!
また、isPresentは真偽値が返るだけですが、ifPresentにして引数でラムダ式を渡せば、null以外の時のみ引数のラムダ式を実行、という風に書けるそうな。
まあでもJava7以降であれば、isPresentよりif (Objects.isNull(obj))(nonNull)で分岐したほうがすっきり書ける気はするけど。

ここまで書いて気付いたけど、サンプルコードの処理内容なら、Objects.toString(obj, null)(StringUtils.defaultStringみたいなやつ)でよかったね…確認不足でした。

0
1
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1