java.util.Optional.or() .orElse(), .orElseGet()的区别

2024-08-27 20:52

本文主要是介绍java.util.Optional.or() .orElse(), .orElseGet()的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

java.util.Optional 是 Java 8 引入的一个容器类,用于表示一个可能包含或不包含非空值的对象。它提供了多种方法来处理可能为空的对象,从而避免使用null值。

Optional 中,.or(), .orElse(), 和 .orElseGet() 都是用于处理可能为空的值的方法,但是它们的行为和使用场景有所不同。

1. Optional.or(Supplier<? extends Optional<? extends T>> supplier)

  • 作用: 如果当前 Optional 为空(即不包含值),则返回一个由 supplier 提供的 Optional 对象。
  • 返回类型: 返回一个 Optional<T> 对象。
  • 使用场景: 通常用于连接多个Optional,其中每个Optional都可能为空,直到找到一个非空的Optional
  • 执行时机: 仅当原始Optional为空时才会调用 supplier,这意味着只有在需要时才会创建新的Optional对象(即惰性求值)。

示例

Optional<String> optional1 = Optional.empty();
Optional<String> optional2 = Optional.of("Hello");Optional<String> result = optional1.or(() -> optional2);System.out.println(result); // 输出: Optional[Hello]

在这个示例中,optional1 是空的,所以 .or() 方法使用 optional2 作为替代。

2. Optional.orElse(T other)

  • 作用: 如果当前 Optional 为空,则返回一个预定义的默认值 other;如果 Optional 有值,则返回该值。
  • 返回类型: 返回 T 类型的对象。
  • 使用场景: 当你有一个明确的默认值,并且你希望在Optional为空时返回这个默认值时使用。
  • 执行时机: 总是执行,即使 Optional 中有值,other 也会被创建和传递。

示例

Optional<String> optional = Optional.empty();String result = optional.orElse("Default Value");System.out.println(result); // 输出: Default Value

在这个示例中,optional 是空的,所以返回默认值 “Default Value”。

3. Optional.orElseGet(Supplier<? extends T> supplier)

  • 作用: 如果当前 Optional 为空,则返回一个由 supplier 提供的值;如果 Optional 有值,则返回该值。
  • 返回类型: 返回 T 类型的对象。
  • 使用场景: 当你需要动态生成一个默认值,并且这个生成过程可能比较昂贵或者复杂时使用。
  • 执行时机: 只有当Optional为空时,才会调用 supplier(即惰性求值)。

示例

Optional<String> optional = Optional.empty();String result = optional.orElseGet(() -> "Generated Value");System.out.println(result); // 输出: Generated Value

在这个示例中,optional 是空的,所以使用 supplier 生成并返回值 “Generated Value”。

总结对比

方法返回值来源是否惰性求值使用场景
or(Supplier)返回 supplier 提供的 Optional 对象链接多个 Optional,直到找到一个非空的 Optional
orElse(T)返回传入的默认值有一个明确的默认值,无论 Optional 是否为空
orElseGet(Supplier)返回 supplier 提供的值动态生成默认值,且只有在需要时才生成

当你知道有一个明确的默认值时,使用 .orElse()。当默认值生成可能昂贵或依赖于一些逻辑时,使用 .orElseGet()。当你想链接多个 Optional,并使用下一个 Optional 作为备用时,使用 .or()

这篇关于java.util.Optional.or() .orElse(), .orElseGet()的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112756

相关文章

java如何解压zip压缩包

《java如何解压zip压缩包》:本文主要介绍java如何解压zip压缩包问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java解压zip压缩包实例代码结果如下总结java解压zip压缩包坐在旁边的小伙伴问我怎么用 java 将服务器上的压缩文件解压出来,

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Spring WebFlux 与 WebClient 使用指南及最佳实践

《SpringWebFlux与WebClient使用指南及最佳实践》WebClient是SpringWebFlux模块提供的非阻塞、响应式HTTP客户端,基于ProjectReactor实现,... 目录Spring WebFlux 与 WebClient 使用指南1. WebClient 概述2. 核心依

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

Spring IoC 容器的使用详解(最新整理)

《SpringIoC容器的使用详解(最新整理)》文章介绍了Spring框架中的应用分层思想与IoC容器原理,通过分层解耦业务逻辑、数据访问等模块,IoC容器利用@Component注解管理Bean... 目录1. 应用分层2. IoC 的介绍3. IoC 容器的使用3.1. bean 的存储3.2. 方法注

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分