Java8实战-总结42
Java8实战-总结42
- 用Optional取代null
- 应用 Optional 的几种模式
- 默认行为及解引用 Optional 对象
- 两个 Optional 对象的组合
- 使用 filter 剔除特定的值
用Optional取代null
应用 Optional 的几种模式
默认行为及解引用 Optional 对象
采用orElse方法读取这个变量的值,使用这种方式还可以定义一个默认值,遭遇空的Optional变量时,默认值会作为该方法的调用返回值。Optional类提供了多种方法读取Optional实例中的变量值。
get()是这些方法中最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常。所以,除非非常确定Optional变量一定包含值,否则使用这个方法是个相当糟糕的主意。此外,这种方式即便相对于嵌套式的null检查,也并未体现出多大的改进。orElse(T other)允许在Optional对象不包含值时提供一个默认值。orElseGet(Supplier<? extends T> other)是orElse方法的延迟调用版,Supplier方法只有在Optional对象不含值时才执行调用。如果创建默认值是件耗时费力的工作,应该考虑采用这种方式(借此提升程序的性能),或者需要非常确定某个方法仅在Optional为空时才进行调用,也可以考虑该方式(这种情况有严格的限制条件)。orElseThrow(Supplier<? extends X> exceptionSupplier)和get方法非常类似,它们遭遇Optional对象为空时都会抛出一个异常,但是使用orElseThrow可以定制希望抛出的异常类型。ifPresent(Consumer<? super T>)能在变量值存在时执行一个作为参数传入的方法,否则就不进行任何操作。
Optional类和Stream接口的相似之处,远不止map和flatMap这两个方法。还有第三个方法filter,它的行为在两种类型之间也极其相似。
两个 Optional 对象的组合
现在,假设有这样一个方法,它接受一个Person和一个Car对象,并以此为条件对外部提供的服务进行查询,通过一些复杂的业务逻辑,试图找到满足该组合的最便宜的保险公司:
public Insurance findCheapestInsurance(Person person, Car car) { // 不同的保险公司提供的查询服务// 对比所有数据return cheapestCompany;
}
还假设想要该方法的一个null安全的版本,它接受两个Optional对象作为参数,返回值是一个Optional<Insurance>对象,如果传入的任何一个参数值为空,它的返回值亦为空。Optional类还提供了一个isPresent方法,如果Optional对象包含值,该方法就返回true,所以第一想法可能是通过下面这种方式实现该方法:
public Optional<Insurance> nullSafeFindCheapestInsurance(Optional<Person> person, Optional<Car> car) { if (person.isPresent() && car.isPresent()) {return Optional.of(findCheapestInsurance(person.get(), car.get())); } else { return Optional.empty(); }
}
这个方法具有明显的优势,从它的签名就能非常清楚地知道无论是person还是car,它的值都有可能为空,出现这种情况时,方法的返回值也不会包含任何值。不幸的是,该方法的具体实现和之前曾经实现的null检查太相似了:方法接受一个Person和一个Car对象作为参数,而二者都有可能为null。利用Optional类提供的特性,可以用更好的方式来实现这个方法。
以不解包的方式组合两个Optional对象结合本节中介绍的map和flatMap方法,用一行语句重新实现之前出现的nullSafeFindCheapestInsurance()方法。答案:可以像使用三元操作符那样,无需任何条件判断的结构,以一行语句实现该方法,
代码如下。public Optional<Insurance> nullSafeFindCheapestInsurance(Optional<Person> person, Optional<Car> car) { return person.flatMap(p -> car.map(c -> findCheapestInsurance(p, c)));
}
这段代码中,对第一个Optional对象调用flatMap方法,如果它是个空值,传递给它
的Lambda表达式不会执行,这次调用会直接返回一个空的Optional对象。反之,如果person
对象存在,这次调用就会将其作为函数Function的输入,并按照与flatMap方法的约定返回
一个Optional<Insurance>对象。这个函数的函数体会对第二个Optional对象执行map操
作,如果第二个对象不包含car,函数Function就返回一个空的Optional对象,整个
nullSafeFindCheapestInsuranc方法的返回值也是一个空的Optional对象。最后,如果
person和car对象都存在,作为参数传递给map方法的Lambda表达式能够使用这两个值安全
地调用原始的findCheapestInsurance方法,完成期望的操作。
Optional类和Stream接口的相似之处远不止map和flatMap这两个方法。还有第三个方法filter,它的行为在两种类型之间也极其相似。
使用 filter 剔除特定的值
经常需要调用某个对象的方法,查看它的某些属性。比如,可能需要检查保险公司的名称是否为“Cambridge-Insurance”。为了以一种安全的方式进行这些操作,首先需要确定引用指向的Insurance对象是否为null,之后再调用它的getName方法,如下所示:
Insurance insurance = ...;
if(insurance != null && "CambridgeInsurance".equals(insurance.getName())) { System.out.println("ok");
}
使用Optional对象的filter方法,这段代码可以重构如下:
Optional<Insurance> optInsurance = ...;
optInsurance.filter(insurance -> "CambridgeInsurance".equals(insurance.getName())) ' .ifPresent(x -> System.out.println("ok"));
filter方法接受一个谓词作为参数。如果Optional对象的值存在,并且它符合谓词的条件,filter方法就返回其值;否则它就返回一个空的Optional对象。如果还记得可以将Optional看成最多包含一个元素的Stream对象,这个方法的行为就非常清晰了。如果Optional对象为空,它不做任何操作,反之,它就对Optional对象中包含的值施加谓词操作。如果该操作的结果为true,它不做任何改变,直接返回该Optional对象,否则就将该值过滤掉,将Optional的值置空。
对Optional对象进行过滤假设在Person/Car/Insurance 模型中,Person还提供了一个方法可以取得
Person对象的年龄,使用下面的签名改写之前的getCarInsuranceName方法:
public String getCarInsuranceName(Optional<Person> person, int minAge)
找出年龄大于或者等于minAge参数的Person所对应的保险公司列表。答案:可以对Optional封装的Person对象进行filter操作,设置相应的条件谓词,
即如果person的年龄大于minAge参数的设定值,就返回该值,并将谓词传递给filter方法,
代码如下所示。
public String getCarInsuranceName(Optional<Person> person, int minAge) { return person.filter(p -> p.getAge() >= minAge) .flatMap(Person::getCar) .flatMap(Car::getInsurance) .map(Insurance::getName) .orElse("Unknown");
}
下表对`Optional`类中的方法进行了分类和概括。


相关文章:
Java8实战-总结42
Java8实战-总结42 用Optional取代null应用 Optional 的几种模式默认行为及解引用 Optional 对象两个 Optional 对象的组合使用 filter 剔除特定的值 用Optional取代null 应用 Optional 的几种模式 默认行为及解引用 Optional 对象 采用orElse方法读取这个变量的值࿰…...
实现日期间的运算——C++
😶🌫️Take your time ! 😶🌫️ 💥个人主页:🔥🔥🔥大魔王🔥🔥🔥 💥代码仓库:🔥🔥魔…...
云上攻防-云原生篇K8s安全Config泄漏Etcd存储Dashboard鉴权Proxy暴露
文章目录 云原生-K8s安全-etcd未授权访问云原生-K8s安全-Dashboard未授权访问云原生-K8s安全-Configfile鉴权文件泄漏云原生-K8s安全-Kubectl Proxy不安全配置 云原生-K8s安全-etcd未授权访问 攻击2379端口:默认通过证书认证,主要存放节点的数据&#x…...
ChatGPT 的工作原理学习 难以理解 需要先找个容易的课来跟下。
ChatGPT 的工作原理 传统搜超搜引擎原理:蜘蛛抓取和数据收集,用户交互查找。 ChatGPT 的工作原理:数据收集称为预训练,用户响应阶段称为推理。 ChatGPT是一种基于自然语言处理技术的人工智能模型,它的工作原理建立在…...
5.DApp-前端网页怎么连接MetaMask
题记 在前端网页连接metamask,以下是全部操作流程和代码。 编写index.html文件 index.html文件如下: <!DOCTYPE html> <html> <head> <title>My DApp</title> <!--导入用于检测Metamask提供者的JavaScript库--> &l…...
手机应用app打开游戏显示连接服务器失败是什么原因?排查解决方案?
亲爱的同学们,有时候我们在使用手机设备时,可能会遇到一个很头疼的问题——连接服务器失败。这个问题不仅让我们感到困扰,还影响到了我们的用户体验。那么,我们究竟能如何解决这个问题呢?今天,笔者就和大家…...
【Java学习之道】指引篇:从入门到入世
引言 你是否曾为找不到适合自己的Java学习之路而烦恼?是否想摆脱混乱的Java知识体系,找到一条从入门到精通的捷径?来《Java学习之道》吧,本专栏为你量身打造,让我们一起轻松踏上Java学习之旅! 第一章、Jav…...
pytorch_quantization安装
官方安装步骤: pip install nvidia-pyindex pip install pytorch-quantization直接安装pytorch-quantization会找不到,需要首先安装 nvidia-pyindex 包, nvidia-pyindex是一个 pip 源,用来连接英伟达的服务器下载需要的包。 如果…...
开源项目汇总
element-plus 人人开源 人人开源 多租户 若依 jeecg https://gitee.com/jeecg/jeecg?_fromgitee_search#https://gitee.com/link?targethttp%3A%2F%2Fidoc.jeecg.com jeeplus JeePlus快速开发平台 j2eefast Sa-Plus...
android.mk介绍
相对于Android的目前来说以前编译底层都使用Android.mk文件配置ndk,现在都使用Cmake这里我们着重介绍下Android.mk 最最基础的几个变量如下 # 定义模块当前路径 LOCAL_PATH : $(call my-dir) #清空当前环境变量 include $(CLEAR_VARS) # 生成libhell.so LOCAL_M…...
极光笔记 | 发送功能使用技巧分享
在全球化竞争激烈的商业环境中,高效的消息通知解决方案是企业成功的关键。EngageLab作为一家专注于海外市场的消息服务平台,为全球企业提供了一体化的消息通知解决方案。其中,EngageLab的国际邮件发送是其强大而灵活的产品服务之一。本文将与…...
Oracle database 开启归档日志 archivelog
Oracle database 开启归档日志 archivelog 归档日志模式 (Archivelog Mode)。归档日志模式是一种数据库运行模式,它允许数据库将日志文件保存到归档日志目录中,以便在需要时进行恢复和还原操作。通过开启归档日志模式,可以提高数据库的可靠性…...
【学一点儿前端】ajax、axios和fetch的概念、区别和易混淆点
省流读法 ajax是js异步技术的术语,早期相关的api是xhr,它是一个术语。 fetch是es6新增的用于网络请求标准api,它是一个api。 axios是用于网络请求的第三方库,它是一个库。 1.Ajax 它的全称是:Asynchronous JavaScri…...
互联网Java工程师面试题·Java 总结篇·第五弹
目录 47、Java 语言如何进行异常处理,关键字:throws、throw、try、catch、finally 分别如何使用? 48、运行时异常与受检异常有何异同? 49、列出一些你常见的运行时异常? 50、阐述 final、finally、finalize 的区别…...
车载电子电器架构 —— 国产基础软件现在与未来
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不…...
在.Core中用EF添加数据库实体类
首先安装dotnet-ef工具,否则提示: *无法执行,因为找不到指定的命令或文件。 可能的原因包括: *你拼错了内置的 dotnet 命令。 *你打算执行 .NET Core 程序,但 dotnet-ef 不存在。 你打算运行全局工具,但在路径上找不到…...
unigui添加ssl(https)访问的方法
首先到腾讯云或者阿里云去申请免费的证书,前提是在该服务商那有申请过域名,怎么找出这个界面?网页顶部一般都有个搜索框,输入【证书】或者【SSL】就能看到了,然后点击申请免费证书,把解析信息填入自己的域名…...
安防监控系统EasyCVR视频汇聚平台设备树收藏按钮的细节优化
视频监控TSINGSEE青犀视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控汇聚平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流&#…...
数据结构----算法--排序算法
数据结构----算法–排序算法 一.冒泡排序(BubbleSort) 1.冒泡排序的核心思想 相邻两个元素进行大小比较,如果前一个比后一个大,就交换 注意: 在冒泡排序的过程中,促进了大的数往后去,小的数…...
Unity3D 基础——使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果
使用 Mathf.SmoothDamp 函数制作相机的缓冲跟踪效果,让物体的移动不是那么僵硬,而是做减速的缓冲效果。将以下的脚本绑定在相机上,然后设定好 target 目标对象,即可看到相机的缓动效果。通过设定 smoothTime 的值,可以…...
Phi-4-mini-reasoning实用刚需:3.8B模型在边缘服务器部署可行性分析
Phi-4-mini-reasoning实用刚需:3.8B模型在边缘服务器部署可行性分析 1. 模型概述与核心优势 Phi-4-mini-reasoning是微软推出的3.8B参数轻量级开源模型,专为数学推理、逻辑推导和多步解题等强逻辑任务设计。这个模型最突出的特点是"小参数、强推理…...
50 岁苹果:变与不变的科技传奇
从车库小作坊到行业巨头:苹果早期的革命之路1976 年,在科技巨头普遍认为电脑仅供企业和政府使用时,乔布斯和沃兹尼亚克在车库用零件组装出 Apple I,虽像半成品却为苹果拿到启动资金。次年的 Apple II 才是关键,它是第一…...
基于Qwen3.5-2B的MySQL智能运维助手:自动SQL优化与故障排查
基于Qwen3.5-2B的MySQL智能运维助手:自动SQL优化与故障排查 1. 引言:当数据库运维遇上AI助手 最近跟几位DBA朋友聊天,发现他们每天要花大量时间处理两类重复性工作:分析慢SQL和排查数据库故障。一位在电商公司工作的朋友吐槽&am…...
小鹅通重磅升级|AI Agent 能力全面护航,私域智能经营新范式
*文中配图及虚拟数据仅作效果展示 随着人工智能越来越贴近经营场景,小鹅通紧扣各位商家的实际需求,在原有产品基础上,以AI Agent为核心,完成了新一轮产品升级——在原有功能基础上,引入场景skills,并通过sk…...
证书创建方法说明
生成证书 方法一:合适(临时测试,不需要管理) 快速生成脚本(一键完成) 创建 create_lan_cert.sh: #!/bin/bash# 配置参数 IP_ADDR"192.168.1.100" # 修改为你的局域网IP DAYS365…...
HTTP 基础
文章目录1、认识 HTTP1.1 超文本2、与 HTTP 有关的组件2.1 Web 服务器3、与 HTTP 有关的协议3.1 TCP3.2 DNS3.3 URI / URL3.4 HTTPS4、HTTP 请求响应过程5、HTTP 请求特征6、详解 HTTP 报文6.1 HTTP 请求 方法6.2 HTTP 请求 URL6.2.1 http6.2.2 主机6.2.3 端口6.2.4 路径6.2.5 …...
Spring Boot 远程调试终于来了!IntelliJ IDEA 新版支持「无 Agent」远程调试
推荐阅读 IDEA 官宣全新AI CLI:Gemini大模型免费用! IDEA 2026.1 EAP 4 发布:新特性太丝滑了! IDEA 官宣:终于可以爽用Cursor了! IDEA 这个骚操作,连 VS Code 都跟不上! IDEA 这个测试接口的好工具,效率 提升 10x 这些 IDEA 技巧没用上,你可能少了一大半摸…...
如何快速实现免费离线OCR:Umi-OCR完整使用指南
如何快速实现免费离线OCR:Umi-OCR完整使用指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库。 …...
从零到精通:Logisim-evolution数字电路设计完全指南
从零到精通:Logisim-evolution数字电路设计完全指南 【免费下载链接】logisim-evolution Digital logic design tool and simulator 项目地址: https://gitcode.com/gh_mirrors/lo/logisim-evolution 想要掌握数字电路设计的精髓,却苦于找不到合适…...
旧手机秒变电脑摄像头:DroidCam创新应用指南
旧手机秒变电脑摄像头:DroidCam创新应用指南 【免费下载链接】droidcam GNU/Linux/nix client for DroidCam 项目地址: https://gitcode.com/gh_mirrors/dr/droidcam 在远程办公与在线协作日益普及的今天,高质量摄像头成为必备工具。然而专用摄像…...
