天天看點

使用OPtional的orElse()問題使用OPtional的orElse()問題

使用OPtional的orElse()問題

項目中有這樣一段代碼:

return Optional.ofNullable(service.A()).orElse(service.B())           

功能顯而易見,service.A()如果傳回值是null,則傳回service.B(),否則直接傳回service.A()。

實際使用中發現:

如果service.A()傳回非null,最終結果是service.A(),然而service.B()這個方法也被執行了。這樣肯定就不對了,如果service.B()中還有插入資料庫或者RPC這種操作,問題就大了。剛開始還以為是什麼執行順序問題,後來在Stack Overflow上看到老外讨論orElse()和orElseGet()的差別,其中一點差別就是orElse(T)無論前面Optional容器是null還是non-null,都會執行orElse裡的方法,orElseGet(Supplier)并不會,如果service無異常抛出的情況下,Optional使用orElse或者orElseGet的傳回結果都是一樣的

stack overflow上有人還給出這樣一個例子

static String B() {
System.out.println("B()...");
return "B";
}

public static void main(final String... args) {
System.out.println(Optional.of("A").orElse(B()));
System.out.println(Optional.of("A").orElseGet(() -> B()));
}
prints
B()...
A
A           

看了上面代碼,我就把我的代碼改成如下即可:

return Optional.ofNullable(service.A()).orElseGet(() -> service.B())           

結論:Optional的orElse(T)若方法不是純計算型的,有與資料庫互動或者遠端調用的,都應該使用orElseGet()

附stack overflow位址:

https://stackoverflow.com/questions/33170109/difference-between-optional-orelse-and-optional-orelseget#