orelse_可选的orElse vs orElseGet

本文探讨了Java 8 Optional中的orElse和orElseGet方法,解释了它们的区别以及在何时使用。orElse需要一个参数作为默认值,而orElseGet则需要一个函数来提供默认值。当Optional对象为空时,两个方法都会执行;但如果Optional有值,orElseGet不会执行提供的函数,而orElse则会。考虑到性能影响,特别是涉及复杂的默认值计算时,orElseGet通常是更好的选择。
摘要由CSDN通过智能技术生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值