Java 8可选orElse而isPresent

时间:2016-05-13 06:19:10

标签: java-8 optional

我对可选的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在第二种情况下就像我的例子一样。我错过了什么?

1 个答案:

答案 0 :(得分:6)

为避免评估替代值,请使用orElseGet

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

没有魔力。如果您调用类似orElse的方法,则会急切地评估其所有参数。 orElseGet通过接收Supplier懒惰来评估它。