orelse
Java 8引入了一个很棒的Optional概念,我们在博客Java 8 Optional中进行了研究 。
因此,为了简要说明一下,Optional用于表示Optional对象或空值,而不是null引用。 这将有助于避免在我们尝试对空引用对象执行某些操作时发生空指针异常。
为了从可选对象访问值 ,很少有诸如get,orELse,orElseGet之类的方法。每当我们查看orElse与orElseGet方法时,我们总是会感到困惑。 有什么区别以及何时使用哪种方法?
当我们概述这些方法时,我们认为可以使用orElse(functionCall())代替orElseGet(Class :: functionDef),它将获得相同的结果。 那么为什么需要创建两种不同的方法呢? 直截了当的答案是行为存在差异,并且在表现情况下它们会产生巨大差异。
让我们在此博客中详细查看其每个行为。
orElse与orElseGet的语法
OrElse方法采用一个参数,如果可选参数没有值,则将返回该参数。
OrElseGet方法需要一个函数,如果可选选项没有值,则该函数将被执行以返回值。
这表明orElse方法需要一个值,而orElseGet方法需要提供者的功能。
如果我们将函数传递给orElse方法,它将始终在执行语句之前执行以适合语法。 但是,在orElseGet方法的情况下,我们无法传递值,并且仅当可选参数没有值时才执行该函数。
区别:orElse与orElseGet
如果optional为null,我们将使用以下函数获取值
public String getFunctionForTest() {
System.out.println( "\n ===== function called ===== " );
return "default value" ; }
让我们来看看Optional对象具有空值的情况
public void orElseVSorElseGet() {
Optional<String> optional = Optional.ofNullable(null);
String orElseGetResult = optional.orElseGet( this ::getFunctionForTest);
System.out.println( "value in orElseGetResult " + orElseGetResult);
String orElseResult = optional.orElse( this .getFunctionForTest());
System.out.println( "value in orElseResult " + orElseResult); }
输出:
===== function called ===== value in orElseGetResult default value ===== function called ===== value in orElseResult default value
正如我们看到的那样,该期权没有价值,我们需要采取其他形式的价值。 因此,正如预期的那样,在两种情况下都会调用该函数。
现在让我们举一个例子,我们在可选对象中有值,我们不需要执行其他部分
public void orElseVSorElseGet() {
Optional<String> optional = Optional.ofNullable( "value found" );
String orElseGetResult = optional.orElseGet( this ::getFunctionForTest);
System.out.println( "value in orElseGetResult " + orElseGetResult);
String orElseResult = optional.orElse( this .getFunctionForTest());
System.out.println( "value in orElseResult " + orElseResult); }
输出:
value in orElseGetResult default value
===== function called ===== value in orElseResult default value
我们知道选项对象具有值,因此我们不需要将价值形式取为其他部分。
因此,我们希望不应执行该功能。 但是,在orElse方法的情况下执行了该功能。
在上面的示例中,我们可能没有注意到性能差异,但是当我们有复杂的过程来采用默认值时,它将影响性能。 您可以考虑需要数据库或网络调用以获取默认值的示例,即使您有值,它也会变慢。
在这种情况下,最好使用orElseGet方法。
在orElse的情况下,即使存在值,也将计算其他部分。 如果我们有默认的静态值,那么orElse是一个不错的选择。 如果您需要默认值的计算逻辑,则应使用orElseGet。
快速阅读
- 可选的OrElse方法采用参数
- 可选中的OrElseGet方法需要供应商函数
- 在orElse方法的情况下,即使存在值,也要计算其他部分
- 如果是orElseGet方法,则只有在Optional对象为空时才计算else部分
- 对于固定值或应使用Else方法
- 如果需要在运行时计算值,则应使用orElseGet
相关话题
翻译自: https://www.javacodegeeks.com/2020/07/optional-orelse-vs-orelseget.html
orelse