optional

参考资料:

Java8 Optional用法和最佳实践 - 掘金

一、背景

根据Oracle文档,Optional是一个容器对象,可以包含也可以不包含非null值。Optional在Java 8中引入,目的是解决  NullPointerExceptions的问题。本质上,Optional是一个包装器类,其中包含对其他对象的引用。在这种情况下,对象只是指向内存位置的指针,并且也可以指向任何内容。从其它角度看,Optional提供一种类型级解决方案来表示可选值而不是空引用。

Optional之前

在Java 8之前,程序员将返回null而不是Optional。这种方法有一些缺点。一种是没有明确的方法来表示null可能是一个特殊值。相比之下,在API中返回Optional是明确的声明,其中可能没有值。如果我们要确保不会出现空指针异常,则需要对每个引用进行显式的空检查,如下所示,我们都同意这是很多样板。

// Life before Optionalprivate void getIsoCode( User user){if (user != null) {Address address = user.getAddress();if (address != null) {Country country = address.getCountry();if (country != null) {String isocode = country.getIsocode();if (isocode != null) {isocode = isocode.toUpperCase();}}}}}

为了避免上述繁杂 的  !=null  ,我们可以引入Optional

二、Optional类的对象创建

均为静态方法创建

1. Optional.empty()

 //第一种创建方式Optional<String> optional=Optional.empty();//判断是否为空. 此时为 空null,System.out.println(optional.isEmpty());//判断是否存在。此时不存在,返回falseSystem.out.println(optional.isPresent());//如果optional为null,则会出现异常.  System.out.println(optional.get());

2.Optional.of()

//第二种创建方式//Optional<String> optional=Optional.of(null); //value 不能为null,不然会报错Optional<String> optional1=Optional.of("123");System.out.println(optional1.get());

3. Optional.ofNullable()

三、检查Optional的value是否存在

下面代码中包含了3种判断方法

   Optional<String> optional=Optional.ofNullable(null);//1.boolean empty = optional.isEmpty();//2.boolean present = optional.isPresent();//3.optional.ifPresent(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println("一旦存在,就调用我这个方法");}});

这个filter方法,有点意思,可以自己去判断是否满足一个条件,满足则创建一个新的Optional对象并且value跟所要判断的optional的value一致。否则返回一个Optional.empty()

四、获取value的方法

让gpt解释一下  orElse() 与orElseGet()的区别

五、Optional的最佳实践

当你在编写项目时使用 Optional 类型时,以下是一些最佳实践建议:

  1. 不要将 Optional 用于方法参数或字段类型

    • Optional 类型主要用于表示可能存在空值的返回值类型。
    • 如果将其用于方法参数或字段类型,则可能会使代码变得复杂,甚至不必要。
  2. 尽量避免使用 Optional 的 get() 方法

    • Optional 的 get() 方法可以用于获取 Optional 对象中的值,但如果 Optional 对象为空,则会抛出 NoSuchElementException 异常。
    • 因此,为了避免异常的发生,最好使用其他方法来处理 Optional 对象的值,比如 orElse() 或 orElseGet()。
  3. 使用 Optional 来处理返回值为空的情况

    • 如果一个方法可能返回 null,应该考虑使用 Optional 类型来代替。
    • 这样可以更明确地表示空值的含义,并提供更加优雅的语法来处理空值的情况。
  4. 使用 Optional 与 Stream API 结合使用

    • Optional 和 Stream API 是 Java 8 中引入的两个重要特性。
    • 它们结合使用可以提高代码的可读性和简洁性。
    • 可以使用 Optional 的 filter() 和 map() 方法来对 Stream 进行过滤和转换操作,从而生成新的 Optional 对象。

// 示例 1:使用 Optional 来处理返回值为空的情况
public Optional<String> getOptionalValue(String key) {String value = getValueByKey(key);return Optional.ofNullable(value);
}// 示例 2:使用 Optional 和 Stream API 进行过滤操作
public Optional<User> findUserByName(String name) {List<User> userList = getUserList();return userList.stream().filter(user -> user.getName().equals(name)).findFirst();
}// 示例 3:使用 orElse() 方法提供默认值
Optional<String> optional = Optional.empty();
String result = optional.orElse("default value");// 示例 4:使用 orElseGet() 方法提供默认值
Optional<String> optional = Optional.empty();
String result = optional.orElseGet(() -> generateDefaultValue());// 示例 5:使用 map() 方法将 Optional 对象中的值转换为其他类型
Optional<String> optional = Optional.of("hello");
Optional<Integer> lengthOptional = optional.map(String::length);// 示例 6:使用 flatMap() 方法展开 Optional 对象
Optional<Optional<String>> optional = Optional.of(Optional.of("hello"));
Optional<String> flattenedOptional = optional.flatMap(Function.identity());

关于示例6的一些解释:

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

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

相关文章

2024年网络安全竞赛-网站渗透

网站渗透 (一)拓扑图 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 使用nmap工具对靶机进行信息收集 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 访问页面即可 3.使用渗透机对服务器渗透,将可渗透页面的名称作为flag提交…

Python:核心知识点整理大全5-笔记

目录 2. 使用方法pop()删除元素 3. 弹出列表中任何位置处的元素 4. 根据值删除元素 3 章 列表简介 3.3 组织列表 3.3.1 使用方法 sort()对列表进行永久性排序 3.3.2 使用函数 sorted()对列表进行临时排序 3.3.3 倒着打印列表 3.3.4 确定列表的长度 3.5 小结 2. 使用方…

软件测试:测试用例八大要素模板

一、通用测试用例八要素 1、用例编号&#xff1b; 2、测试项目&#xff1b; 3、测试标题&#xff1b; 4、重要级别&#xff1b; 5、预置条件&#xff1b; 6、测试输入&#xff1b; 7、操作步骤&#xff1b; 8、预期输出 二、具体分析通用测试用例八要素 1、用例编号 一般是数字…

[NAND Flash 2.1] NAND Flash 闪存改变了现代生活

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 1989年NAND闪存面世了&#xff0c;它曾经且正在改变了我们的日常生活。 NAND 闪存发明之所以伟大&#xff0c;是因为&#xff0c…

一个CV算法工程师在技术方面的小反思

极市导读 正如作者所说,做一个算法工程师最重要的素质是在海量的算法方案中理解,吃透那些真正的干货,然后不断在实践中去验证,并总结吸收到自己的脑子里。本文记录了作者在算法工程师这个岗位上一年后总结的一些关于技术上的经验总结。>>加入极市CV技术交流群,走在计…

怎样解决编译后的exe文件运行时产生的错误?

编译后的exe文件运行时&#xff0c;错误如下错误提示&#xff1a;Traceback (most recent call last):File "pd.py", line 1, in <module>from pdf2docx import parse ModuleNotFoundError: No module named pdf2docx 怎样解决&#xff1f; 这个错误提示表明…

java数据结构面试题

1.栈和队列的共同特点是&#xff08;只允许在端点处插入和删除元素&#xff09; 4.栈通常采用的两种存储结构是&#xff08;线性存储结构和链表存储结构&#xff09; 5.下列关于栈的叙述正确的是&#xff08;D&#xff09; A.栈是非线性结构 B.栈是一种树状结构 C.栈具有先进先…

苹果OS X系统介绍(Mac OS --> Mac OS X --> OS X --> macOS)

文章目录 OS X系统介绍历史与版本架构内核与低级系统图形&#xff0c;媒体和用户界面应用程序和服务 特性用户友好强大的命令行安全性集成与互操作性 总结 OS X系统介绍 OS X是由苹果公司为Macintosh计算机系列设计的基于UNIX的操作系统。其界面友好&#xff0c;易于使用&…

使用 nohup java - jar 不输出日志

要在使用nohup java -jar命令时不输出日志&#xff0c;可以将标准输出和标准错误输出重定向到特殊设备文件/dev/null。这样做将会丢弃所有的输出。 以下是在Linux中使用nohup java -jar命令并禁止输出日志的示例&#xff1a; 复制代码 nohup java -jar your-application.jar …

Python可视化(二)——Seaborn

Seaborn是一个基于matplotlib的可视化库&#xff0c;其为用户提供了高级接口&#xff0c;并且该工具还深度集成了pandas的数据结构。并且该工具该集成了很多数据库&#xff0c;配合官网给出的代码示例&#xff0c;可以更方便的进行操作。 官网对它的介绍为&#xff1a; Seabo…

Servlet学习笔记

简介 浏览器请求处理流程&#xff1a;浏览器发请求 > 服务器tomcat( > 应用程序 ( > servlet) ) Servlet应用的三大作用域&#xff1a;request&#xff0c;session&#xff0c;application tomcat存放项目的层级结构 注释&#xff1a;servlet原引用包名 javax.serv…

卡尔曼滤波器

欢迎访问我的博客首页。 卡尔曼滤波器 1. 参考 1. 参考 卡尔曼滤波器&#xff0c;B 站&#xff0c;2020。扩展卡尔曼滤波器&#xff0c;CSDN&#xff0c;2023。

Git的安装以及SSH配置

前言 近期工作需要&#xff0c;所以版本管理工具要用到Git&#xff0c;某些操作需要ssh进行操作&#xff0c;在某次操作中遇到&#xff1a;git bash报错&#xff1a;Permission denied, please try again。经排查是ssh没有配置我的key&#xff0c;所以就借着这篇文章整理了一下…

WorkPlus即时通讯,让沟通零障碍!企业协作更高效

如今&#xff0c;随着信息技术的快速发展&#xff0c;企业对于高效沟通和即时协作的需求也日益增长。在这个数字化时代&#xff0c;WorkPlus作为一款领先的企业级移动办公平台&#xff0c;以其强大的即时通讯功能和卓越的用户体验&#xff0c;成功为企业打造了高效沟通的新时代…

input = torch.randn(20, 2, 11, 11, 32)输出形式

input torch.randn(20, 2, 11, 11, 32) m torch.nn.AdaptiveAvgPool3d((1,1, 32)) xm(input) print(x.shape) 结果&#xff1a; 也就是不用管批次和通道数

pico示波器使用

文章目录 Pico示波器保存波形Pico示波器录制数据Pico示波器解析CAN报文Pico示波器保存波形 Pico示波器可以通过以下步骤保存波形: 在示波器上选择要保存的波形。连接示波器到计算机上,可以使用USB或者Ethernet连接。打开PicoScope软件,选择“File”菜单,然后选择“Save As…

Python开发运维:Python垃圾回收机制

目录 一、理论 1.Python垃圾回收机制 一、理论 1.Python垃圾回收机制 &#xff08;1&#xff09;引⽤计数器 1&#xff09;环状双向链表 refchain 在python程序中创建的任何对象都会放在refchain链表中。 name "david" age 20 hobby ["篮球",游泳…

放苹果 .

把m个同样的苹果放在n个同样的盘子里&#xff0c;允许有的盘子空着不放&#xff0c;问共有多少种不同的分法&#xff1f; 注意&#xff1a;如果有7个苹果和3个盘子&#xff0c;&#xff08;5&#xff0c;1&#xff0c;1&#xff09;和&#xff08;1&#xff0c;5&#xff0c;1&…

spring集成mybatis简单教程

首先说下实现了什么效果&#xff0c;就是不用每次查询前手动创建 sessionFactory和添加datasource文件了。 整个工程结构是这样的 这次我也把代码放在了gitee上&#xff0c;方便大家更全貌的看到所有的实现细节。代码链接如下&#xff1a; Java: 一些Java代码 (gitee.com) …

大话数据结构-查找-多路查找树

注&#xff1a;本文同步发布于稀土掘金。 7 多路查找树 多路查找树&#xff08;multi-way search tree&#xff09;&#xff0c;其每个结点的孩子可以多于两个&#xff0c;且每一个结点处可以存储多个元素。由于它是查找树&#xff0c;所有元素之间存在某种特定的排序关系。 …