java8,optional.orElse()不起作用,但是optional.orElseGet()起作用

时间:2018-08-16 10:10:06

标签: java-8

这是我的代码:

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吗?

我尝试再次运行很多次,没有任何变化,但是我尝试编写一个小示例,可以选择String而不是从存储库中替换,这也是可以的。

2 个答案:

答案 0 :(得分:4)

.orElse(getCurrencyExchangeRateFromApi(request))中,getCurrencyExchangeRateFromApi(request)始终执行(不管Optional是否为空)。

.orElseGet(() -> getCurrencyExchangeRateFromApi(request))中,getCurrencyExchangeRateFromApi(request)仅在Optional为空的情况下执行。

如果“不起作用”表示您正在获取异常,则说明getCurrencyExchangeRateFromApi(request)方法存在问题。

答案 1 :(得分:2)

就像Eran所说的,orElseorElseGet之间有区别,无论Optional是什么,orElse中直接调用的方法都是 orElseGet被执行,而supplieroptional时,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

输出:

equals