首页  >  文章  >  Java  >  什么时候应该使用Optional.orElseGet()而不是Optional.orElse()?

什么时候应该使用Optional.orElseGet()而不是Optional.orElse()?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-02 09:38:31721浏览

 When Should I Use Optional.orElseGet() Instead of Optional.orElse()?

理解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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn