我对可选的orElse
方法感到非常困惑。
我使用了以下代码,每次调用orElse
大小写,尽管存在可选值:
Optional<NotificationSettings> ons = userProfileDao.loadNotificationSettingsByTransportType(type);
NotificationSettings notificationSettings = ons.orElse(createNotificationSettings(profile, type));
如果我将代码重写为以下内容,则选择正确的路径(ifPresent
):
Optional<NotificationSettings> ons = userProfileDao.loadNotificationSettingsByTransportType(type);
NotificationSettings notificationSettings = ons.isPresent() ? ons.get() : createNotificationSettings(profile, type);
我认为orElse
在第二种情况下就像我的例子一样。我错过了什么?
答案 0 :(得分:6)
为避免评估替代值,请使用orElseGet
:
NotificationSettings notificationSettings =
ons.orElseGet(() -> createNotificationSettings(profile, type));
没有魔力。如果您调用类似orElse
的方法,则会急切地评估其所有参数。 orElseGet
通过接收Supplier
懒惰来评估它。