java 8のOptional

4562 ワード

オリジナルステートメント:完全に著者のオリジナルですので、著者の労働力を尊重してください。転載は必ず原文の住所を明記してください。
2014年にjava 8が発表された後、多くの新しい特性が広く使われています。個人的には、一番高周波で出現したのは以下の三箇新のものだと思います。
1.Optionalクラス2.新しい日付クラスCalendar.Lambada表現
今日はまずOptional類を整理します。いくつかのAPiの方法があります。
1. empty
2. equal
3. filter
4. flatMap
5. get
6. hashCode
7. ifPresent
8. map
9. of
10. ofNullable
11. orElse
12. orElseGet
13. orElseThrow
14. toString
このような役割は何ですか?(いくつかのよく使われる例について説明します。)
JAVA開発者が空のポインタの異常を避けるために作った煩雑なif...else処理を解決します。
例えば、Articleクラスがあります。name属性を持っています。name属性が"java 8 Optional"に等しいかどうかを判断したいです。
Article article = articleRepository.findOne(id);
if (article != null) {
  if (article.getName() != null) {
    if (article.getName().equal("java 8  Optional")) {
       return true;
    } else {
       return false;
    }
  } else {
    return false;
  }
} else {
  return false;
}
これは問題がないです。コードがとても厳しいと言えます。ただ、多くのif...elseは見たところ耐えられないです。上のコードは多そうに見えますが、機能は簡単です。上に空のポインターがないと、コードは以下のように簡単になります。
Article article = articleRepository.findOne(id);
if (article.getName().equal("java 8  Optional")) {
    return true;
} else {
    return false;
}
しかし、データベースにidに対応するarticleが存在しない可能性があるので、空のポインタ異常を判断しなければならない。たとえ存在しても、namenullであるかもしれない。しかし、Optional類はこうすることができます。
return Optional.ofNullable(articleRepository.findOne(id)).map(c -> c.getName())
    .map(name -> name.equal("java 8  Optional"))
    .orElse(false);
3行のコード、簡潔、厳格、優雅。
初めての接触かもしれませんが、ちょっと分かりにくいかもしれません。
上の構造は実はこのように理解できます。
return Optional.ofNullable(...) //1
      .map(...) //2
      .map(...) //3
      .orElse(...); //4
以下で詳しく説明します。
括弧1では、初期データを表しています(Optional)。パラメータとしてarticleに入る方法です。この方法は、OfNullableパッケージクラスを構築し、データOptionalの戻り値をラッピングします。この戻り値がarticleRepository.findOne(id)であれば、null方法を直接実行します。orElseを取って、直接falseに相当します。第1のreturn false方法を実行すると、null方法のパラメータはmap式であり、mapLambdaによって包装された非空データ(cの戻り値は空ではないことが確認されている)を表し、Optionalは実行され、戻り値はarticleRepository.findOne(id)に続き、この戻り値がc.getName()である場合はOptionalである。nameを実行し、結果はまだnullであり、もし空でないなら、次のorElse方法を継続します。同じように、第二のreturn false方法もmap式であり、第一のmap方法の戻り値(Optional)によって包装された非空データ(name)は第二のmap方法のLambdaパラメータに入ってきます。後にmapの方法がないので、この文の結果はname全体として動作する結果となるだろう。
上記の説明は、このような1つのname.equal("java 8 Optional")の動作の詳細な説明であるので、mapの方法は無限に多いことがわかる。説明が複雑に見えますが、このような思考に慣れたら、実はそのことです。
また、mapメソッドはOptional式ですので、中にはもっと多くのことができます。例えば、Optionalオブジェクトを取得した後、map属性を変更して、もう一つの長期化操作を行うことができます。
return Optional.ofNullable(articleRepository.findOne(id))
    .map(c -> {
          c.setAuthor("dongfangyihaolan");
          articleRepository.saveAndFlush(c);
          return c.getName()
    })
    .map(name -> name.equal("java 8  Optional"))
    .orElse(false);
Lambda全体の判断に影響を与えず、articleオブジェクトを更新する際の空ポインタの問題もうまく処理されている。
tip:author表現がステートメントブロックである場合には、明示的にmapを加算する必要があり、returnのデータはnameにカプセル化され、そのパッケージのデータはパラメータとして次のarticleに伝達され、次のLambdaが実行される。
一般的な方法は、フィルタリングされたreturnがあります。上記のように、有効なOptionalに対してだけ後のmap動作を実行したいですが、どうすればいいですか?
もちろん、jpa方法でフィルタ検索をしたり、mapの前で有効かどうかを判断したりすることができますが、今はmapを使ってもいいです。以下のとおりです
return Optional.ofNullable(articleRepository.findOne(id))
    .filter(c -> ifEffect(c))
    .map(c -> c.getName())
    .map(name -> name.equal("java 8  Optional"))
    .orElse(false);
filterは、有効か否かを独自に判断する方法である。articleであれば、return c.getName()も実行され、filterのために実行される。
同様に、filterは文ブロックの形で、より多くの処理を行うこともできる。
また、ifEffect()およびfalseは、orElseにパッケージされたtrueのように、mapと仮定して、nullかどうかifPresentで判断し、getでパッケージのデータエンティティを取り出すことができる。
もっと多いarticleについての内容はやはり自分で公式APIを見てみましょう。