理解Optional.orElse()和Optional.orElseGet()之间的区别
Optional.orElse()和Optional.orElseGet() Java 中的两个方法有助于处理Optional,一个可能包含或不包含值的容器对象。
orElse() 的说明
orElse() 采用一个值(其他)作为参数。如果Optional存在(包含一个值),它返回该值。但是,如果Optional为空,它将返回提供的值(其他)。
orElseGet()的描述
orElseGet()也接受一个参数,但是这个现在是供应商功能接口了。供应商不接受任何参数并返回一个值。与orElse()不同,orElseGet()只会在Optional为空时调用Supplier函数。
什么时候使用orElseGet()?
orElse的主要区别() 和 orElseGet() 是指提供的参数会导致昂贵的操作。如果Optional不为空,使用orElse()仍然会执行提供的操作,即使它是不必要的。然而,orElseGet() 避免了这种不必要的操作,只在需要时执行它。
示例
考虑以下示例:
<code class="java">Optional<String> myString = Optional.empty(); String result1 = myString.orElse(ExpensiveOperation.getExpensiveString()); // ExpensiveOperation always executed String result2 = myString.orElseGet(() -> ExpensiveOperation.getExpensiveString()); // ExpensiveOperation only executed if Optional is empty</code>
测试用例
为了说明差异,请考虑一个返回可选字符串的函数:
<code class="java">public Optional<String> findMyPhone(int phoneId) { ... }</code>
场景 1:orElse()
Optional.isPresent() | Used phone |
---|---|
True (redundant call) | NewExpensivePhone |
False | NewExpensivePhone |
场景 2:orElseGet()
Optional.isPresent() | Used phone |
---|---|
True | MyCheapPhone |
False | NewExpensivePhone |
如测试用例所示,orElse() 始终执行提供的函数,而 orElseGet() 只执行
结论
理解 orElse() 和 orElseGet() 之间的区别在使用可选值时至关重要。 orElseGet() 提供了一种处理Optional值的有效方法,避免了Optional存在时不必要的操作。
以上是什么时候应该使用Optional.orElseGet()而不是Optional.orElse()?的详细内容。更多信息请关注PHP中文网其他相关文章!