2016-05-13 15 views
1

オプションのorElseメソッドについては非常に混乱しています。私は次のようにコードを書き換える場合、正しいパス(ifPresent)が選択されるJava 8オプションorElse isPresentとは対照的に

Optional<NotificationSettings> ons = userProfileDao.loadNotificationSettingsByTransportType(type); 
NotificationSettings notificationSettings = ons.orElse(createNotificationSettings(profile, type)); 

Optional<NotificationSettings> ons = userProfileDao.loadNotificationSettingsByTransportType(type); 
NotificationSettings notificationSettings = ons.isPresent() ? ons.get() : createNotificationSettings(profile, type); 
を私は任意の値が存在するが orElse場合を毎回呼び出す次のコードを使用している

私はorElseが私の例のように同じことをやっていると思いました。私は何が欠けていますか?

NotificationSettings notificationSettings = 
    ons.orElseGet(() -> createNotificationSettings(profile, type)); 

魔法はありません:代替値を使用orElseGetを評価避けるため

答えて

6

orElseのようなメソッドを呼び出すと、そのすべてのパラメータが熱心に評価されます。 orElseGetは遅れて評価されるSupplierを受け取ることによってそれを回避します。

関連する問題