这是我的代码:
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而不是从存储库中替换,这也是可以的。
答案 0 :(得分:4)
在.orElse(getCurrencyExchangeRateFromApi(request))
中,getCurrencyExchangeRateFromApi(request)
始终执行(不管Optional
是否为空)。
在.orElseGet(() -> getCurrencyExchangeRateFromApi(request))
中,getCurrencyExchangeRateFromApi(request)
仅在Optional
为空的情况下执行。
如果“不起作用”表示您正在获取异常,则说明getCurrencyExchangeRateFromApi(request)
方法存在问题。
答案 1 :(得分:2)
就像Eran所说的,orElse
和orElseGet
之间有区别,无论Optional
是什么,orElse
中直接调用的方法都是 orElseGet
被执行,而supplier
为optional
时,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