ホームページ  >  記事  >  Java  >  Optional.orElse() の代わりに Optional.orElseGet() を使用する必要があるのはどのような場合ですか?

Optional.orElse() の代わりに Optional.orElseGet() を使用する必要があるのはどのような場合ですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-02 09:38:31721ブラウズ

 When Should I Use Optional.orElseGet() Instead of Optional.orElse()?

Optional.orElse() と Optional.orElseGet() の違いを理解する

Optional.orElse() と Optional.orElseGet()これは、値を含む場合と含まない場合があるコンテナ オブジェクトである Optional の処理に役立つ Java の 2 つのメソッドです。

orElse() の説明

orElse() は、引数として値(その他)を指定します。 Optional が存在する (値が含まれている) 場合は、その値が返されます。ただし、Optional が空の場合は、指定された値 (other) を返します。

orElseGet() の説明

orElseGet() も引数を取りますが、これは今度はサプライヤーの機能インターフェイスです。サプライヤーは引数をとらず、値を返します。 orElse() とは異なり、orElseGet() は、Optional が空の場合にのみ Supplier 関数を呼び出します。

orElseGet() を使用する場合?

orElse の主な違い() および orElseGet() は、指定された引数によって負荷の高い操作が発生する場合です。 Optional が空でない場合、 orElse() を使用すると、たとえ不要であっても、指定された操作が実行されます。ただし、orElseGet() はこの不要な操作を回避し、必要な場合にのみ実行します。

次の例を考えてみましょう:

<code class="java">Optional<String> myString = Optional.empty();

String result1 = myString.orElse(ExpensiveOperation.getExpensiveString()); // ExpensiveOperation always executed
String result2 = myString.orElseGet(() -> ExpensiveOperation.getExpensiveString()); // ExpensiveOperation only executed if Optional is empty</code>

テスト ケース

違いを説明するために、オプションの文字列を返す関数を考えてみましょう:

<code class="java">public Optional<String> findMyPhone(int phoneId) { ... }</code>

シナリオ 1: orElse()

Optional.isPresent() Used phone
True (redundant call) NewExpensivePhone
False NewExpensivePhone

シナリオ 2: orElseGet()

Optional.isPresent() Used phone
True MyCheapPhone
False NewExpensivePhone

テスト ケースで見られるように、orElse() は常に提供された関数を実行しますが、orElseGet() はのみ実行します。

結論

オプションを使用する場合、orElse() と orElseGet() の違いを理解することが重要です。 orElseGet() は、オプションが存在する場合に不必要な操作を回避することで、オプションの値を処理する効率的な方法を提供します。

以上がOptional.orElse() の代わりに Optional.orElseGet() を使用する必要があるのはどのような場合ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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