Java Optional的orElse()與orElseGet()兩個方法比較 - Baeldung

banq發表於2020-11-04

Optional的API通常有兩種可能引起混淆的方法:  orElse() 和orElseGet():

String name = Optional.of("baeldung").orElseGet(() -> getRandomName());
String name = Optional.of("baeldung").orElse(getRandomName());


結論:對於上面這個示例,orElseGet()明顯優於 orElse() 。僅當不存在Optional 值時才執行作為引數傳遞Supplier方法(orElseGet()的引數函式為() -> getRandomName(),該方法只有不存在"baeldung"值時才會執行);而orElse()涉及每次執行的getRandomName()方法的計算 。
除了效能方面,其他值得考慮的因素還包括:
  • 如果該方法將執行一些附加邏輯怎麼辦?例如,進行一些資料庫插入或更新
  • 即使當我們為orElse() 引數分配一個物件時:String name = Optional.of("baeldung").orElse("Other")
    我們仍然無緣無故地建立“Other” 物件

這就是為什麼對我們而言,根據需要在orElse() 和orElseGet()中 做出謹慎的決定非常重要–預設情況下,每次使用orElseGet() 更為有意義,除非預設物件已經構造並且可以直接訪問。

相關文章