java 8のOptional
4562 ワード
オリジナルステートメント:完全に著者のオリジナルですので、著者の労働力を尊重してください。転載は必ず原文の住所を明記してください。
2014年にjava 8が発表された後、多くの新しい特性が広く使われています。個人的には、一番高周波で出現したのは以下の三箇新のものだと思います。
1.
今日はまず
JAVA開発者が空のポインタの異常を避けるために作った煩雑な
例えば、
初めての接触かもしれませんが、ちょっと分かりにくいかもしれません。
上の構造は実はこのように理解できます。
括弧1では、初期データを表しています(
上記の説明は、このような1つの
また、mapメソッドは
tip:
一般的な方法は、フィルタリングされた
もちろん、jpa方法でフィルタ検索をしたり、
同様に、filterは文ブロックの形で、より多くの処理を行うこともできる。
また、
もっと多い
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
が存在しない可能性があるので、空のポインタ異常を判断しなければならない。たとえ存在しても、name
はnull
であるかもしれない。しかし、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
式であり、map
はLambda
によって包装された非空データ(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を見てみましょう。