1. ホーム

[解決済み】`Optional.orElse()`と`Optional.orElseGet()`の相違点

2022-04-18 18:13:13

質問

の違いを理解しようとしています。 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() を投げることはありません。 NoSuchElementExceptionisPresent() は常に真を返しますが、明らかにそうではなく、単に 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サービスやデータベースからデフォルト値を取得する必要がある場合、それは突然非常に重要になります。