深入探究 Java 8 新特性:Optional 类允许为空的对象类

news2025/1/14 0:56:41

深入探究 Java 8 新特性:Optional 类

概念说明

​ 在 Java 8 中,引入了许多令人兴奋的新特性,其中之一就是 Optional 类。这个类主要用于解决空指针异常(NullPointerException)的问题,提供了一种更安全和优雅的方式来处理可能为 null 的值。


为什么需要 Optional 类?

​ 在传统的 Java 编程中,我们经常需要检查一个对象是否为 null,以避免出现空指针异常。这导致了代码的冗余和可读性的降低。Java 8 引入的 Optional 类可以让我们更加优雅地处理可能为 null 的情况,从而减少代码中的条件检查。

类声明

以下是一个 java.util.Optional 类的声明:

public final class Optional<T> extends Object

Optional 类的基本用法

Optional 类是一个容器对象,它可以包含一个非空的值,也可以表示一个为空的值。我们可以使用 Optional.of() 方法创建一个包含非空值的 Optional 对象,或者使用 Optional.empty() 方法创建一个空的 Optional 对象。

下面是一个简单的示例:

Optional<String> optionalValue = Optional.of("Hello, Optional!");//非空值对象
Optional<String> emptyOptional = Optional.empty();//空值对象

如何避免空指针异常?

​ 通过使用 Optional 类,我们可以采用一种更加优雅的方式来避免空指针异常。下面是一个示例:

String name = null;
Optional<String> optionalName = Optional.ofNullable(name);//声明这个对象可能为空
String actualName = optionalName.orElse("Unknown");//指定了对象为空时的默认值
System.out.println("Name: " + actualName);

​ 在上面的示例中,我们使用了 Optional.ofNullable() 方法来创建一个可能为空的 Optional 对象。然后,通过 orElse() 方法,我们指定了在对象为空时的默认值。


如何从 Optional 中获取值?

我们可以使用不同的方法从 Optional 对象中获取值,例如:

  • get():获取值,如果值为空则会抛出异常。
  • orElse(T other):获取值,如果值为空则返回指定的默认值。
  • orElseGet(Supplier<? extends T> other):获取值,如果值为空则通过 Supplier 返回默认值。
  • orElseThrow(Supplier<? extends X> exceptionSupplier):获取值,如果值为空则抛出指定的异常。

Optional 类的链式操作

Optional 类支持链式操作,这使得我们可以在一系列的操作中处理可能为空的值。例如:

String result = Optional.ofNullable("Hello")
                       .map(s -> s + ", Optional!")
                       .orElse("Default Value");
System.out.println(result);

通过链式操作来处理数据,从而降低代码的复杂度,提高代码的可读性和可维护性。


java 中泛型标记符:

E - Element (在集合中使用,因为集合中存放的是元素)
T - Type(Java 类)
K - Key(键)
V - Value(值)
N - Number(数值类型)
? - 表示不确定的 java 类型


Optional类的方法

序号方法 & 描述
1static Optional empty()返回空的 Optional 实例。
2boolean equals(Object obj)判断其他对象是否等于 Optional。
3Optional filter(Predicate<? super predicate)如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。
4 Optional flatMap(Function<? super T,Optional> mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional
5*T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException
6int hashCode()返回存在值的哈希码,如果值不存在 返回 0。
7void ifPresent(Consumer<? super T> consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。
8*boolean isPresent()如果值存在则方法会返回true,否则返回 false。
9Optional map(Function<? super T,? extends U> mapper)如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。
10*static Optional of(T value)返回一个指定非null值的Optional。
11*static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。
12*T orElse(T other)如果存在该值,返回值, 否则返回 other。
13T orElseGet(Supplier<? extends T> other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。
14 T orElseThrow(Supplier<? extends X> exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常
15String toString()返回一个Optional的非空字符串,用来调试

注意: 这些方法是从 java.lang.Object 类继承来的。


下面是具体的实例,这个实例来自于菜鸟教程:

public class OptionalDemo {
    public static void main(String[] args) {
        Integer value1=null;
        Integer value2=new Integer(10);


        // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
        Optional<Integer> a = Optional.ofNullable(value1);
        Optional<Integer> b = Optional.of(value2);
        System.out.println(sum(a,b));

    }
    public static Integer sum(Optional<Integer> a,Optional<Integer> b){

        // Optional.isPresent - 判断值是否存在
        System.out.println("第一个参数是否存在"+a.isPresent());
        System.out.println("第二个参数是否存在"+b.isPresent());

        // Optional.orElse - 如果值存在,返回它,否则返回默认值
        Integer value1=a.orElse(new Integer(0));

        //Optional.get - 获取值,值需要存在
        Integer value2=b.get();

        System.out.println(value1);

        return value1+value2;
    }

}

输出结果如下:

在这里插入图片描述


总结

Java 8 引入的 Optional 类为我们提供了一种更加安全和优雅的方式来处理可能为空的值,避免了空指针异常的发生。通过使用 Optional 类,我们可以编写出更加简洁、可读性更高的代码。

作者:Stevedash

发表于:2023年8月18日 19点45分

来源:Java 8 Optional 类 | 菜鸟教程 (runoob.com)

注:本文内容基于个人学习理解,如有错误或疏漏,欢迎指正。感谢阅读!如果觉得有帮助,请点赞和分享。

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

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

相关文章

kali换源之后更新

kali换源之后更新 1.更新索引 apt-get update 2.更新软件 apt-get upgrade 3.删除缓存包 apt-get clean

【网络教程】如何创建/添加钉钉机器人以及如何获取机器人的Token/Secret

文章目录 创建钉钉机器人添加钉钉机器人获取机器人的Token/Secret相关网站创建钉钉机器人 这里以PC端的操作为例,按照如下操作进行 访问 钉钉开放平台选择机器人选项卡,点击右上角的创建应用,这里会有一个弹窗,我这里选择的是继续使用旧版,如图按照要求填写相关信息创建自…

【Influxdb数据迁移,从windos移到linux】

前提——保证两边的版本不要相差太多 1、windows的导出G:\influxdb\2为暂存的目录 D:\influxdb-1.8.3_windows_amd64\influxdb-1.8.3-1>influxd backup -portable -database mydb G:\influxdb\2导出之后会有一堆文件 全部上传到/var/lib/influxdb这个目录下。这个应该是默…

vue3中使用第三方插件mitt实现任意组件通讯

vue3中使用第三方插件mitt实现任意组件通讯 组件通讯是vue3组合式开发的核心之一&#xff0c;现在我在写代码时&#xff0c;一个组件的代码超过了200行&#xff0c;基本都会拆分组件。组件拆分后&#xff0c;组件之间的通讯就很重要&#xff0c;总结了一下&#xff0c;目前有这…

阿里云席明贤:明天的视频云2.0

编者按 本文是“解构多媒体新常态”系列文章的第二篇&#xff0c;LiveVideoStack对话了阿里云视频云负责人席明贤&#xff08;花名右贤&#xff09;。面对风云变幻的内外环境&#xff0c;阿里云在视频云赛道是坚定向前的&#xff0c;在与右贤的接触中&#xff0c;他给我留下非常…

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-BP灰狼算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介绍程序…

基于医疗领域数据微调LLaMA——ChatDoctor模型

文章目录 ChatDoctor简介微调实战下载仓库并进入目录创建conda环境并配置环境&#xff08;安装相关依赖&#xff09;下载模型文件微调数据微调过程全量微调基于LoRA的微调基于微调后的模型推理 ChatDoctor简介 CHatDoctor论文&#xff1a; ChatDoctor: A Medical Chat Model F…

JavaScript:交集和差集的应用场景

在集合A和集合B中&#xff0c;属于集合A&#xff0c;同时也属于集合B的元素组成的集合&#xff0c;就是交集。 在A中所有不属于集合B元素&#xff0c;组合成集合&#xff0c;就是差集。 那么在平时的开发中&#xff0c;如何使用差集和交集来解决问题呢&#xff1f; 现在有这…

Fixed Price Incentive Fee (FPIF)

总价加激励费用 (FPIF)。这种总价合同为买方和卖方提供了一定的灵活性&#xff0c;允许一定的绩 效偏离&#xff0c;并对实现既定目标给予相关的财务奖励&#xff08;通常取决于卖方的成本、进度或技术 绩效&#xff09;。FPIF 合同中会设置价格上限&#xff0c;高于此价格上限…

剑指 Offer 61. 扑克牌中的顺子(C++实现)

剑指 Offer 61. 扑克牌中的顺子https://leetcode.cn/problems/bu-ke-pai-zhong-de-shun-zi-lcof/ 优雅写法 bool isStraight(vector<int>& nums) {int maxVal INT_MIN, minVal INT_MAX;unordered_set<int> s;for (const int num : nums){if (num 0) // 跳过…

基于STM32+FreeRTOS的四轴机械臂

目录 项目概述&#xff1a; 一 准备阶段&#xff08;都是些废话&#xff09; 二 裸机测试功能 1.摇杆控制 接线&#xff1a; CubeMX配置&#xff1a; 代码&#xff1a; 2.蓝牙控制 接线&#xff1a; CubeMX配置 代码&#xff1a; 3.示教器控制 4.记录动作信息 5.执…

Matlab 频谱图中如何设置频率刻度

Matlab 频谱图中如何设置频率刻度&#xff08;横坐标&#xff09; 1、概述 时域信号经FFT 变换后得到了频谱&#xff0c;在作图时还必须设置正确的频率刻度&#xff0c;这样才能从图中得到正确的结果。下面来介绍如何设置正确的频率刻度。 2、案例分析 有一个余弦信号&#…

浏览器渲染原理 - 输入url 回车后发生了什么

目录 渲染时间点渲染流水线1&#xff0c;解析&#xff08;parse&#xff09;HTML1.1&#xff0c;DOM树1.2&#xff0c;CSSOM树1.3&#xff0c;解析时遇到 css 是怎么做的1.4&#xff0c;解析时遇到 js 是怎么做的 2&#xff0c;样式计算 Recalculate style3&#xff0c;布局 la…

Android Studio实现解析HTML获取json,解析json图片URL,将URL存到list,进行瀑布流展示

目录 效果build.gradle&#xff08;app&#xff09;添加的依赖&#xff08;用不上的可以不加&#xff09;AndroidManifest.xml错误activity_main.xmlitem_image.xmlMainActivityImage适配器ImageModel 接收图片URL 效果 build.gradle&#xff08;app&#xff09;添加的依赖&…

STM32 printf函数

printf函数输出流程 用户调用printf()函数到C标准库调用printf函数相关部分&#xff0c;printf函数由编译器提供的stdio.h解析。包含在usart.h文件中。fputc()最终实现输出。用户需要根据最终输出的硬件重新定义该函数&#xff0c;此过程为&#xff1a;printf重定向。 printf的…

用它来画文档插图简直太方便了

支持常用的12864接口&#xff0c;图像可保存&#xff0c;鼠标左键可delete键删除选区&#xff0c;鼠标右键抓取坐标。 支持快捷撤销操作CtrlZ、回退操作CtrlY&#xff0c;可点击此处下载软件。

Educational Codeforces Round 153 (Rated for Div. 2)ABC

Educational Codeforces Round 153 (Rated for Div. 2) 目录 A. Not a Substring题目大意思路核心代码 B. Fancy Coins题目大意思想核心代码 C. Game on Permutation题目大意思想核心代码 A. Not a Substring 题目大意 给定一个只包含“&#xff08;”和“&#xff09;”这两…

EV PV AC SPI CPI TCPI

SPI EV / PV CPI EV / ACCPI 1.25 SPI 0.8 PV 10 000 BAC 100 000EV PV * SPI 10 000 * 0.8 8000 AC EV / CPI 8000 / 1.25 6400TCPI (BAC - EV) / (BAC -AC) (100 000 - 8 000) / (100 000 - 6 400) 92 000 / 93 600 0.98290598

Python土力学与基础工程计算.PDF-钻探泥浆制备

Python 求解代码如下&#xff1a; 1. rho1 2.5 # 黏土密度&#xff0c;单位&#xff1a;t/m 2. rho2 1.0 # 泥浆密度&#xff0c;单位&#xff1a;t/m 3. rho3 1.0 # 水的密度&#xff0c;单位&#xff1a;t/m 4. V 1.0 # 泥浆容积&#xff0c;单位&#xff1a;…

画质提升+带宽优化,小红书音视频团队端云结合超分落地实践

随着视频业务和短视频播放规模不断增长&#xff0c;小红书一直致力于研究&#xff1a;如何在保证提升用户体验质量的同时降低视频带宽成本&#xff1f; 在近日结束的音视频技术大会「LiveVideoStackCon 2023」上海站中&#xff0c;小红书音视频架构视频图像处理算法负责人剑寒向…