[解決済み】`Optional.orElse()`と`Optional.orElseGet()`の相違点
質問
の違いを理解しようとしています。
Optional<T>.orElse()
と
Optional<T>.orElseGet()
メソッドを使用します。
に対する記述です。
orElse()
メソッドは
"値があればその値を返し、なければother.を返す."
一方
orElseGet()
メソッドは
もし存在すればその値を返し、そうでなければ他のものを呼び出してその呼び出しの結果を返します。
は
orElseGet()
メソッドは、Supplier の機能的なインターフェイスを取り、基本的にパラメータを取らずに
T
.
を使用する必要があるのは、どのような状況でしょうか。
orElseGet()
? メソッドがある場合
T myDefault()
を実行すればいいのでは?
optional.orElse(myDefault())
よりも
optional.orElseGet(() -> myDefault())
?
とは思えません。
orElseGet()
はラムダ式の実行を後回しにするとかで、何の意味があるんだ?(私なら、より安全な
Optional<T>
その
get()
を投げることはありません。
NoSuchElementException
と
isPresent()
は常に真を返しますが、明らかにそうではなく、単に
T
のように
orElse()
).
他に何か私が見逃している違いはありますか?
解決方法は?
次の2つのシナリオを考えてみましょう。
Optional<Foo> opt = ...
Foo x = opt.orElse( new Foo() );
Foo y = opt.orElseGet( Foo::new );
もし
opt
が値を含んでいない場合、この2つは確かに等価です。しかし、もし
opt
が行います。
が値を含んでいる場合、いくつの
Foo
オブジェクトが作成されますか?
P.s.: もちろん、この例ではその差は測定不能でしょう。しかし、たとえばリモートWebサービスやデータベースからデフォルト値を取得する必要がある場合、それは突然非常に重要になります。
関連
-
[解決済み] Apache Camelのログに簡単なテキストを記録する
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] StringBuilderとStringBufferの違いについて
-
[解決済み] wait()とsleep()の違いについて
-
[解決済み] Javaクラスにおけるcanonical name、simple name、class nameの違いは何ですか?
-
[解決済み] JDKとJREの違いは何ですか?
-
[解決済み] Java 8のmap()メソッドとflatMap()メソッドの違いは何ですか?
-
[解決済み】HashMap、LinkedHashMap、TreeMapの違いについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] java.sql.SQLException: ORA-00933: SQL コマンドが正しく終了していません。
-
[解決済み] javaで部分クラスを実装する方法
-
[解決済み] java.lang.ClassCastException: java.util.Arrays$ArrayList は java.util.ArrayList にキャストできません。
-
[解決済み] java.util.concurrent.ExecutionException 例外をどのように処理しますか?
-
[解決済み] Java の条件付きコンパイル:コードチャンクをコンパイルしないようにするには?
-
[解決済み] 型の不一致:ArrayListからListへの変換ができない
-
[解決済み] 午前0時からの時間を秒単位で取得する方法
-
[解決済み] javaでメソッドを呼び出すプログラムのエラー修正
-
[解決済み] 文字列の長さに応じて文字列をトリミングする
-
[解決済み] java.sql.SQLRecoverableException: IO エラーです。NL Exceptionが発生しました