Java「オプション」クラスの完全なガイド
オプションは、潜在的にヌル値をより安全に処理するためにJava 8によって導入されたコンテナクラスであり、その中心的な目的は、明示的に「値を欠いている」ことと、nullpointerexceptionのリスクを減らすことです。 1. optional.empty()、optional.of(value)を使用して空のインスタンスを作成します。 2。ispresent()を組み合わせることを避け、get()を直接get()。 orelse()を使用してデフォルト値を提供することを優先する必要があります。 orelseget()は遅延計算を実装します。この方法は、デフォルトの値がオーバーヘッドの場合に推奨されます。 orelsethrow()値が欠落しているときに例外をスローします。 3。Map()を使用して値を変換し、flatmap()はネストされたオプションを避け、条件に応じてフィルター値をフィルター()フィルター値を避けます。 4.オプションをメソッドパラメーター、クラスフィールド、またはコレクション要素として使用することは禁止されており、optional.empty()の代わりにnullを返すことは禁止されています。 5.チェーンコールされたフィルター、マップ、およびフラットマップをチェーンで固定して、安全なデータ処理プロセスを構築し、オプションの::ストリームを使用して空の値をフィルタリングし、ストリームで結果を抽出できます。オプションを正しく使用すると、コードセキュリティと読みやすさが向上し、「オプションの結果」を表現するための優先リターンタイプになります。
Java 8で導入されたJavaのOptional
クラスは、非ヌル値を含む場合と含まない場合があるコンテナオブジェクトです。開発者がnull
値をより優雅に処理し、 NullPointerException
(NPE)のリスクを減らすのに役立つように設計されました。 Optional
すべての問題に対するソリューションではありませんが、正しく使用すると、コードクリーナー、より安全で、より表現力豊かにすることができます。

JavaアプリケーションでOptional
を効果的に使用するための完全なガイドを次に示します。
Optional
は何ですか、そしてなぜそれを使用するのですか?
Optional<t></t>
は、存在しない可能性のある値のラッパーです。メソッドからnull
を返す代わりに、 Optional<t></t>
を返すことができ、結果が空になる可能性があることを明確にすることができます。

なぜそれを使うのですか?
- 設計による
NullPointerException
を回避します。 - APIを明確にします - 発信者は、値が存在しない可能性があることを知っています。
- それらを無視するのではなく、欠損値のより良い処理を奨励します。
-
map
、filter
、flatMap
などのメソッドを使用した機能スタイルのプログラミングを促進します。
public optional <string> findNameById(int id){ // optional.empty()が見つからない場合は返します return repository.findbyid(id) .map(user :: getName); }
Optional
インスタンスを作成します
Optional
を作成する主な方法は3つあります。

1。Optional.Empty Optional.empty()
- 不在値の場合
価値がないことがわかっているときに使用してください。
optional <string> empty = optional.empty(); //値なし
2。Optional.of Optional.of(value)
- 非ヌル値の場合
値がnullではないと確信している場合は使用してください。値がnullの場合、 NullPointerException
をスローします。
文字列name = "Alice"; optional <string> optname = optional.of(name); // わかりました
3。optional.ofnullable Optional.ofNullable(value)
- nullの値に対して
ヌルになる可能性のある値を安全にラップします。
文字列名= getnameFromDataBase(); // nullを返す可能性があります optional <string> optname = optional.ofnullable(name); //名前がnullであってもOK
bestベストプラクティス:
ofNullable()
使用潜在的にnull値を扱う場合。
値の確認と取得
Optional
ができたら、値を安全に抽出する必要があります。
isPresent()
およびisEmpty()
- 存在を確認します
optional <string> opt = optional.of( "bob"); if(opt.ispresent()){ System.out.println( "name:" opt.get()); }
またはより良い(Java 11以降):
if(opt.isempty()){ System.out.println( "NO NAME FOUNTS"); }
isPresent()
get()
を使いすぎないでください。Optional
の目的を打ち負かします。
get()
- 値を取得します(危険!)
値が存在すると確信している場合はget()
のみを呼び出します。それ以外の場合、それはNoSuchElementException
をスローします。
string value = opt.get(); //危険!
cet()を既に確認していない限り、
get()
を避けますisPresent()
。
orElse(default)
- フォールバックを提供します
存在する場合は値を返し、それ以外の場合はデフォルトを返します。
文字列name = opt.orelse( "不明");
orElseGet(Supplier)
- 怠zyなフォールバック
デフォルトを計算するときに使用するのは高価です。
string name = opt.orelseget(() - > ComputeDefaultName());
defaultデフォルトにコンピューティングが含まれる場合、orelse
orElseGet()
orElse()
を好みます。
orElseThrow()
- 欠落している場合は例外をスローします
存在を強制するのに最適です。
string name = opt.orelsethrow(() - > new IllegalArgumentException( "name is require"));
Java 10以降、以下を使用することもできます。
文字列name = opt.orelsethrow(); // nosuchelementexceptionをスローします
変換値とフィルタリング値
Optional
サポート機能操作を抽出せずにラップ値で動作します。
map()
- 値を変換します
値が存在し、新しいOptional
を返す場合は関数を適用します。
optional <string> nameopt = getUser()。map(user :: getName);
getUser()
がOptional<User>
を返す場合、 map
して安全に抽出して変換します。
flatMap()
- ネストされたOptional
は避けてください
変換が別のOptional
を返すときに使用します。
オプション<string> emailopt = getUser() .flatmap(user-> user.getemail()); //電子メールはオプションである場合があります<String>
flatMap
がなければ、 Optional<Optional<String>>
を取得します。
filter()
- 条件付きで値を維持します
予測と一致する場合にのみ値を保持します。
オプション<string> adultname = getPerson() .filter(p-> p.getage()> = 18) .map(person :: getName);
その人が18歳未満の場合、結果はOptional.empty()
になります。
Optional
の一般的な誤用
Optional
は強力ですが、しばしば悪用されます。一般的な落とし穴は次のとおりです。
メソッドパラメーターとして
Optional
を使用しないでください// BAD public void setName(optional <string> name){...}
代わりに、メソッドを過負荷するか、
null
を使用します。クラスに
Optional
フィールドを保存しないでください// クラスの人{ プライベートオプション<string> middlename; }
これにより、シリアル化が複雑になり、不要なオーバーヘッドが追加されます。
null
を使用して文書化します。isPresent()
呼び出して、nullチェックのように()を一緒にget()
ないでください// apattion anti-Pattern if(opt.ispresent()){ use(opt.get()); }
ifPresent()
:opt.ifpresent(this :: use);
Optional
を返すメソッドからnull
を返さないでください//❌これは決してしません nullを返します。 // optional.empty()の代わりに
高度なヒント
チェーン操作
map
、 filter
、およびflatMap
をチェーンして、安全なパイプラインを構築できます。
文字列email = ueserrepo.findbyid(123) .filter(user :: isactive) .map(user :: getContactinfo) .flatmap(contactInfo :: GeteMail) .filter(email-> email.endswith( "@company.com"))) .orelse( "default@company.com");
ストリームで使用します
Optional
、 Stream
でうまく機能します。
リスト<オプション<文字列>>リスト= ...; リスト<文字列> results = list.stream() .FLATMAP(オプション::ストリーム) .collect(collectors.tolist());
これにより、空のオプションが除去され、値が抽出されます。
まとめ
Optional
は、より安全で表現力のあるコードを書くためのツールであり、すべてのヌルチェックに代わるものではありません。主にリターンタイプとして使用して、オプションの結果を示します。
ベストプラクティスの要約:
- oplation値がない場合の場合、
Optional
返すタイプとして使用します。 -
orElse()
の代わりにorElseGet()
を使用して、高価なデフォルトを使用します。 - clean Clean
map
、flatMap
、およびフィルターのためのfilter
。 - field、パラメーター、またはコレクションで
Optional
を避けてください。 -
Optional.empty()
の代わりにnull
を返さないでください。
適切に使用すると、 Optional
NullPointerException
を排除し、コードの意図をより明確にするのに役立ちます。
基本的に、それはnull
を完全に避けることではなく、APIデザインで不在を一流のコンセプトにすることです。
以上がJava「オプション」クラスの完全なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undress AI Tool
脱衣画像を無料で

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Pythonのメモリ管理は、参照カウントとゴミ収集メカニズムに基づいています。 1.参照カウントメカニズムにより、参照番号が0の場合にオブジェクトがすぐにリリースされることが保証されます。Sys.getrefcount()の戻り値は、基準自体を増やすため、実際の参照よりも1高くなります。 2。循環参照は参照カウントでクリーニングすることはできず、GCモジュールの世代リサイクルに依存します。 gc.collect()を呼び出すことは、到達不可能なオブジェクトをリサイクルできます。 3。実際の開発では、大きなオブジェクト参照の長期保持を避ける必要があります。 WeakRefの弱い参照を使用し、メモリをリリースするためにタイムリーな場所を使用し、Tracemallocを使用してメモリの割り当てを監視できます。 4。概要:Pythonは参照カウントとガベージコレクションを組み合わせてメモリを管理し、開発者はツールを使用して参照パイプを最適化できます。

怠zyな読み込みは、アソシエーションにアクセスするときにクエリのみであり、n 1の問題に簡単につながる可能性があります。これは、関連データが必要かどうかが判断されないシナリオに適しています。 2。()を使用して緊急読み込みを使用して関連データをロードして、バッチ処理シナリオに適したn 1クエリを回避します。 3.緊急荷重を使用してパフォーマンスを最適化する必要があり、N 1の問題はLaraveldebugbarなどのツールを介して検出できます。モデルの属性を備えた$は、不必要なパフォーマンスオーバーヘッドを避けるために慎重に使用されます。

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorapiandapiandcallingtfromphpusingcurlorguzzle.2.runpythosscriptsdirectlyfrompurspusingec()orshell_exec()

Laravelは、ネイティブSQLクエリの使用をサポートしていますが、安全性を確保するためにパラメーターバインディングを優先する必要があります。 1。DB:: Select()を使用して、SQL注入を防ぐためにパラメーターバインディングを使用して選択クエリを実行します。 2。db:: update()を使用して更新操作を実行し、影響を受ける行の数を返します。 3。DB::挿入()を使用してデータを挿入します。 4。db:: delete()を使用してデータを削除します。 5。DB:: Statement()を使用して、Create、Alterなどの結果セットなしでSQLステートメントを実行します。 6. QueryBuilderでWhereraw、SelectRaw、およびその他の方法を使用して、ネイティブ表現を組み合わせてセキュリティを改善することをお勧めします

EfficientDataStructureSlikEarrayLayListLinkEdlistAndPrimitiveCollectionStoreduceOverhead;

Pythonの3成分演算子は、if-elseの判断を簡潔に実装するために使用され、その構文は「value_if_trueif conditionelsevalue_if_false」です。 1.正と負の値に基づいて対応する文字列を返すなど、単純な割り当てに使用できます。 2。分母がゼロ以外であることを決定するなど、分割エラーを回避できます。 3.文字列形式の条件に応じてコンテンツを選択できます。 4.リスト派生式の異なる要素にラベルを割り当てることができます。この演算子はバイナリ分岐にのみ適しており、複数の層をネストしないでください。複雑なロジックは、従来のIF-Elif-Else構造を使用して、読みやすさを確保する必要があります。

レスポンシブプログラミングは、ProjectReactorおよびSpringWebFluxを介してJavaでの低レイテンシの非ブロッキングサービスを実装します。 1. ProjectReactorは、2つのコアタイプを提供します。モノとフラックスは、非同期データフローの宣言的処理をサポートし、オペレーターチェーンを介した変換、フィルター、およびその他の操作をサポートします。 2。SpringWebFluxは反応器上に構築され、2つのプログラミングモデルをサポートします:注釈と機能。 Nettyなどの非ブロッキングサーバーで実行され、多数の同時接続を効率的に処理できます。 3. WebFlux Reactorを使用すると、I/O集約型シナリオでの並行性の機能とリソースの使用率が向上し、SSEとWebSOを自然にサポートします。

テーブルレイアウト:固定は、レイアウトに影響するコンテンツを避けるために、最初の行のセル幅によってテーブル列の幅を強制的に決定します。 1.テーブルレイアウトの設定:テーブル幅を修正して指定します。 2.最初の行th/tdの特定の列幅比を設定します。 3。ホワイトスペースを使用:Nowrap、Overflow:Hidden and Text-Overflow:Ellipsisを使用してテキストオーバーフローを制御します。 4。安定したレイアウトと高性能レンダリングを必要とするバックグラウンド管理、データレポート、およびその他のシナリオに適用できます。これは、レイアウトジッターを効果的に防止し、レンダリング効率を向上させることができます。
