orelse_可选的orElse vs orElseGet

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

相关话题

  • Java 8可选细节
  • Java 8功能
  • Lambda表达式Java 8

翻译自: https://www.javacodegeeks.com/2020/07/optional-orelse-vs-orelseget.html

orelse

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331309.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jvm(6)-java类文件结构(字节码文件)

【0】README0.1&#xff09;本文部分文字描述转自 “深入理解jvm”&#xff0c;旨在学习类文件结构 的基础知识&#xff1b;0.2&#xff09;本文荔枝以及荔枝的分析均为原创&#xff1b;0.3&#xff09;下面的截图中有附注t*编号&#xff0c;不关乎博文内容&#xff1b;0.4&am…

你可能不知道的 10 条 SQL 技巧

转载自 58沈剑 开源中国 一、一些常见的SQL实践 &#xff08;1&#xff09;负向条件查询不能使用索引 select * from order where status!0 and stauts!1 not in/not exists都不是好习惯 可以优化为in查询&#xff1a; select * from order where status in(2,3) &#x…

夜神模拟器模拟安卓测试_使用模拟进行测试

夜神模拟器模拟安卓测试如果使用正确的方法&#xff0c;模拟对象将非常有用。 我在需要驱动软件开发使用的帖子中分享了一些使用Mock Objects的经验。 在这篇文章中&#xff0c;我分享了两件事 –使用模拟进行基于合同的测试。 –用于组织模拟代码的模式。 基于合同的测试 …

java记录类型_Java中的记录类型

java记录类型于2020年3月发布的JDK 14引入了记录 &#xff08;预览语言功能&#xff09;&#xff0c;该记录提供了一种紧凑的语法来声明主要用于保存数据的类。 在记录中 &#xff0c;所有低级&#xff0c;重复且容易出错的代码都类似于构造函数&#xff0c;访问器和通用方法&a…

代理模式(多线程实现状态监控)

【-1】README-1.1&#xff09;本文部分文字描述转自“head first 设计模式”&#xff0c;旨在学习 远程代理对象 的基础知识&#xff1b;-1.2&#xff09;多线程实现糖果自动售卖机监控程序为原创&#xff1b;-1.3&#xff09;博文最后&#xff0c;转载了代理模式的定义&#…

一篇文章搞定面试中的二叉树

转载自 IOExceptioner 算法与数据结构 在上一篇介绍二叉树&#xff08; Android面试题算法之二叉树 、红黑树详细分析&#xff0c;看了都说好&#xff09;&#xff0c;没看的读者建议先去了解了解&#xff0c;接下来再给大家带来一篇关于二叉树的文章。 最近总结了一些数据结…

清洁代码_清洁单元测试

清洁代码编写使用JUnit和某些模拟库的“单元测试”测试很容易。 即使测试甚至不是单元测试并提供可疑的价值&#xff0c;它们也可能产生使某些涉众满意的代码覆盖范围。 编写单元测试&#xff08;在理论上是单元测试&#xff0c;但是比基础代码更复杂&#xff09;因此也很容易编…

jvm(6)-Class字节码文件结构总结

【0】README 0.1&#xff09;本文总结于 Clas字节码文件&#xff0c;旨在理清 Class字节码文件的大体结构&#xff1b; 【1】干货开始 对上图的分析&#xff08;Analysis&#xff09;&#xff1a;A1&#xff09;offset0 A1.1&#xff09;头四个字节为CAFEBABE&#xff1a;表示…

Android面试题算法之二叉树

转载自 qing的世界 程序员小乐文章目录 前言二叉树的递归&#xff08;深度优先&#xff09;处理二叉树的层序处理(广度优先)总结“一、前言今年可谓是跌宕起伏的一年&#xff0c;幸好结局还算是圆满。开年的时候由于和公司CTO有过节&#xff0c;被"打入冷宫"&#…

java 读取 文本块_Java文本块

java 读取 文本块文本块是JDK增强建议&#xff08; JEP 355 &#xff09;&#xff0c;可以在JDK 13和14中用作预览语言功能。它计划在JDK 15中成为永久性功能。文本块是跨越多行并且不需要的String文字。对于大多数转义序列。 动机 在标准Java字符串中嵌入XML&#xff0c;JSON…

代理模式之虚拟代理(仅了解)

【0】README0.1&#xff09;本文全文转自 “head first 设计模式”&#xff0c;旨在了解 虚拟代理动态代理&#xff1b;0.2&#xff09;晚辈我 java.swing 烂到渣&#xff0c;没有写出干货荔枝&#xff0c;抱歉&#xff1b;【1】虚拟代理简述1&#xff09;远程代理&#xff1a;…

红黑树详细分析

转载自 coolblog 算法与数据结构“一、红黑树简介红黑树是一种自平衡的二叉查找树&#xff0c;是一种高效的查找树。它是由 Rudolf Bayer 于1972年发明&#xff0c;在当时被称为对称二叉 B 树(symmetric binary B-trees)。后来&#xff0c;在1978年被 Leo J. Guibas 和 Robert…

rest api如何创建_REST:创建资源

rest api如何创建资源创建是常见的REST API操作。 在这篇文章中&#xff0c;我们将看到如何创建单个资源。 客户要求 通常&#xff0c;通过将POST请求发送到父集合资源来创建资源。 这将使用新生成的ID创建一个新的下属资源。 例如&#xff0c;对/ projects的POST请求可用于在…

java字节码指令简介(仅了解)

【0】README0.1&#xff09;本文全文转自 “深入理解jvm”&#xff0c; 旨在了解 java字节码指令 的基础知识&#xff1b;【1】写在前面1&#xff09;由于jvm 采用面向操作数栈而不是寄存器的结构&#xff0c;所以大多数的指针都不包含操作数&#xff0c;只有一个操作码&#x…

什么是 CAS 机制

转载自 永远爱大家的 程序员小灰示例程序&#xff1a;启动两个线程&#xff0c;每个线程中让静态变量count循环累加100次。最终输出的count结果是什么呢&#xff1f;一定会是200吗&#xff1f;加了同步锁之后&#xff0c;count自增的操作变成了原子性操作&#xff0c;所以最终…

java xmpp_Java XMPP负载测试工具

java xmpp在本文中&#xff0c;我们将开发用Java编写的XMPP负载测试工具。 目录 1.简介 2. XMPP负载测试工具 3.先决条件 4. LoadXmppTest Java程序 4.1。 创建一个新的Maven项目 4.2。 创建主类 4.3。 XmppManager类 4.4。 建立 4.5。 负载测试 5.总结 6.参考 7.下载Maven项目…

jvm(7)-虚拟机类加载机制

【0】README0.1&#xff09;本文转自“深入理解jvm”&#xff0c;旨在学习 虚拟机类加载机制 的基础知识&#xff1b;【1】概述1&#xff09;类加载机制&#xff1a;虚拟机把描述类的数据从Class 文件加载到内存&#xff0c;并对数据进行校验&#xff0c;转换解析和初始化&…

什么是CAS机制?(进阶篇)

转载自 永远爱大家的 程序员小灰 这一期我们来深入介绍之前遗留的两个问题&#xff1a; Java当中CAS的底层实现 CAS的ABA问题和解决方法 首先看一看AtomicInteger当中常用的自增方法 incrementAndGet&#xff1a; public final int incrementAndGet() {for (;;) {int cur…

c++ 前缀 变量命名_前缀命名

c 前缀 变量命名如果您是第一次查看Takes或Cactoos的源代码&#xff0c;很可能会像其他命名约定一样被命名约定触发&#xff0c;这意味着大多数类名都有两个字母的前缀&#xff1a; BkSafe &#xff0c; RqFake &#xff0c; RsWithStatus &#xff0c; TkGzip等。 老实说&…

jvm(8)-虚拟机字节码执行引擎

【0】README0.1&#xff09;本文转自 “深入理解jvm”&#xff0c;旨在学习 虚拟机字节码执行引擎 的基础知识&#xff1b;【1】概述1&#xff09;物理机和虚拟机的执行引擎&#xff1a; 物理机的执行引擎是直接建立在处理器&#xff0c;硬件&#xff0c;指令集和操作系统层面上…