Java 8 java8,可选.orElse()不工作,但可选.orElseGet()工作

Java 8 java8,可选.orElse()不工作,但可选.orElseGet()工作,java-8,Java 8,这是我的代码: return repository.findFirstByFxDateAndTransCurrAndCrdhldBillCurr( LocalDate.parse(request.getDate()), request.getTransactionCurrency(), request.getBillingCurrency()) .orElse(getCurrencyExchangeRateFromApi(request)); 它

这是我的代码:

return repository.findFirstByFxDateAndTransCurrAndCrdhldBillCurr(
            LocalDate.parse(request.getDate()), request.getTransactionCurrency(), request.getBillingCurrency())
            .orElse(getCurrencyExchangeRateFromApi(request));
它不起作用,但我将.orElse更新为.orElseGet

return repository.findFirstByFxDateAndTransCurrAndCrdhldBillCurr(
            LocalDate.parse(request.getDate()), request.getTransactionCurrency(), request.getBillingCurrency())
            .orElseGet(() -> getCurrencyExchangeRateFromApi(request));
它的工作非常完美,我不知道原因,是java8的bug吗

我多次尝试再次运行,没有任何变化,但我尝试编写一个小示例,可选字符串而不是从存储库中运行,这也没问题。

.orElse(getCurrencyExchangeRateFromApi(请求))
,始终执行
GetCurrencyExchangeFromAPI(请求)
(无论
可选
是否为空)

.orElseGet(()->getCurrencyExchangeRateFromApi(请求))
中,只有当
可选
为空时,才会执行
GetCurrencyExchangeFromAPI(请求)


如果“不工作”意味着您得到了一个异常,那么您的
getCurrencyExchangeRateFromApi(请求)可能有问题
方法。

正如Eran所提到的,
orElse
orElseGet
之间有区别,无论
可选的是什么,在
orElse
中直接调用的方法将被执行,而
orElseGet
将调用
供应商
,只要
可选的
null

下面是一个小演示:

public class TestOptional {
    public static void main(String... args) {
        Optional<String> val = Optional.ofNullable("Hello");
        String s = val.orElse(test());
        System.out.println(s);
        s = val.orElseGet(() -> test());
        System.out.println(s);
    }

    public static String test() {
        System.out.println("Hello world");
        return "hi";
    }
}
Hello world
Hello
Hello