目次
Optionalは何ですか、そしてなぜそれを使用するのですか?
Optionalインスタンスを作成します
1。Optional.Empty Optional.empty() - 不在値の場合
2。Optional.of Optional.of(value) - 非ヌル値の場合
3。optional.ofnullable Optional.ofNullable(value) - nullの値に対して
値の確認と取得
isPresent()およびisEmpty() - 存在を確認します
get() - 値を取得します(危険!)
orElse(default) - フォールバックを提供します
orElseGet(Supplier) - 怠zyなフォールバック
orElseThrow() - 欠落している場合は例外をスローします
変換値とフィルタリング値
map() - 値を変換します
flatMap() - ネストされたOptionalは避けてください
filter() - 条件付きで値を維持します
Optionalの一般的な誤用
高度なヒント
チェーン操作
ストリームで使用します
まとめ
ホームページ Java &#&チュートリアル Java「オプション」クラスの完全なガイド

Java「オプション」クラスの完全なガイド

Jul 27, 2025 am 12:22 AM
java optional

オプションは、潜在的にヌル値をより安全に処理するために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「オプション」クラスの完全なガイド

Java 8で導入されたJavaのOptionalクラスは、非ヌル値を含む場合と含まない場合があるコンテナオブジェクトです。開発者がnull値をより優雅に処理し、 NullPointerException (NPE)のリスクを減らすのに役立つように設計されました。 Optionalすべての問題に対するソリューションではありませんが、正しく使用すると、コードクリーナー、より安全で、より表現力豊かにすることができます。

Java「オプション」クラスの完全なガイド

JavaアプリケーションでOptionalを効果的に使用するための完全なガイドを次に示します。


Optionalは何ですか、そしてなぜそれを使用するのですか?

Optional<t></t>は、存在しない可能性のある値のラッパーです。メソッドからnullを返す代わりに、 Optional<t></t>を返すことができ、結果が空になる可能性があることを明確にすることができます。

Java「オプション」クラスの完全なガイド

なぜそれを使うのですか?

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

Optionalインスタンスを作成します

Optionalを作成する主な方法は3つあります。

Java「オプション」クラスの完全なガイド

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()の代わりに

高度なヒント

チェーン操作

mapfilter 、およびflatMapをチェーンして、安全なパイプラインを構築できます。

文字列email = ueserrepo.findbyid(123)
    .filter(user :: isactive)
    .map(user :: getContactinfo)
    .flatmap(contactInfo :: GeteMail)
    .filter(email-> email.endswith( "@company.com")))
    .orelse( "default@company.com");

ストリームで使用します

OptionalStreamでうまく機能します。

リスト<オプション<文字列>>リスト= ...;
リスト<文字列> results = list.stream()
    .FLATMAP(オプション::ストリーム)
    .collect(collectors.tolist());

これにより、空のオプションが除去され、値が抽出されます。


まとめ

Optionalは、より安全で表現力のあるコードを書くためのツールであり、すべてのヌルチェックに代わるものではありません。主にリターンタイプとして使用して、オプションの結果を示します。

ベストプラクティスの要約:

  • oplation値がない場合の場合、 Optional返すタイプとして使用します。
  • orElse()の代わりにorElseGet()を使用して、高価なデフォルトを使用します。
  • clean Clean mapflatMap 、およびフィルターのためのfilter
  • field、パラメーター、またはコレクションでOptionalを避けてください。
  • Optional.empty()の代わりにnullを返さないでください。

適切に使用すると、 Optional NullPointerExceptionを排除し、コードの意図をより明確にするのに役立ちます。

基本的に、それはnullを完全に避けることではなく、APIデザインで不在を一流のコンセプトにすることです。

以上がJava「オプション」クラスの完全なガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Pythonメモリ管理の例 Pythonメモリ管理の例 Jul 28, 2025 am 01:10 AM

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

Laravel Lazy Loadingと熱心な読み込み Laravel Lazy Loadingと熱心な読み込み Jul 28, 2025 am 04:23 AM

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

PHPを機械学習モデルと統合します PHPを機械学習モデルと統合します Jul 28, 2025 am 04:37 AM

usearestapitobridgephpandmlmodelsbyrunningthemodelinpythonviaflaskorapiandapiandcallingtfromphpusingcurlorguzzle.2.runpythosscriptsdirectlyfrompurspusingec()orshell_exec()

Laravel Raw SQLクエリの例 Laravel Raw SQLクエリの例 Jul 29, 2025 am 02:59 AM

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

Javaアプリケーションでメモリ使用量を最適化します Javaアプリケーションでメモリ使用量を最適化します Jul 28, 2025 am 02:40 AM

EfficientDataStructureSlikEarrayLayListLinkEdlistAndPrimitiveCollectionStoreduceOverhead;

Pythonの成分演算子の例 Pythonの成分演算子の例 Jul 28, 2025 am 02:57 AM

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

Project ReactorとSpring WebFluxを使用したJavaでのリアクティブプログラミング Project ReactorとSpring WebFluxを使用したJavaでのリアクティブプログラミング Jul 29, 2025 am 12:04 AM

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

CSSテーブルレイアウト修正例 CSSテーブルレイアウト修正例 Jul 29, 2025 am 04:28 AM

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

See all articles