Java8新特性—Optional类

news2024/12/23 23:09:55

前言

Java 8中引入了一个新的Optional类,它可以让开发人员更好地处理可能为空的值。Optional类提供了一种方式,可以更加优雅地处理null值,并在运行时避免NullPointerException异常的出现。本文将介绍Optional类的基本语法、使用场景和示例。

基本语法

Optional类是一个泛型类,可以包含任何类型的值。Optional类有两个静态方法:of()和empty()。of()方法用于创建一个包含非空值的Optional对象,如果传入的值为null,则会抛出NullPointerException异常。而empty()方法则用于创建一个空的Optional对象。

Optional类还提供了一些方法,用于判断Optional对象是否为空、获取Optional对象中的值等。例如,isPresent()方法用于判断Optional对象是否为空,如果Optional对象包含值,则返回true;否则返回false。get()方法用于获取Optional对象中的值,如果Optional对象为空,则会抛出NoSuchElementException异常。

Optional类还提供了一些其他方法,如map()、flatMap()、orElse()、orElseGet()、orElseThrow()等,这些方法可以让开发人员更加灵活地处理Optional对象中的值。

3b81757c607aa5bfda7c9b64bc2e8f56.png

使用场景

Optional类适用于任何可能返回null值的情况。例如,在处理集合或数组时,可能会出现null值,使用Optional类可以更好地处理这种情况。在使用第三方库时,可能会返回null值,此时使用Optional类可以避免NullPointerException异常的出现。在编写公共API时,使用Optional类可以更好地指导开发人员如何处理可能为空的值。

使用示例

下面是一个示例,展示了如何使用Optional类来避免NullPointerException异常的出现:

public class Person {
    private String name;
    private Integer age;

    public Person(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public Optional<String> getName() {
        return Optional.ofNullable(name);
    }

    public Optional<Integer> getAge() {
        return Optional.ofNullable(age);
    }

    public static void main(String[] args) {
        Person person1 = new Person("Tom", 20);
        Person person2 = new Person(null, 25);

        String name1 = person1.getName().orElse("Unknown");
        String name2 = person2.getName().orElse("Unknown");

        Integer age1 = person1.getAge().orElseThrow(() -> new RuntimeException("Age is missing."));
        Integer age2 = person2.getAge().orElseThrow(() -> new RuntimeException("Age is missing."));

        System.out.println("Person 1: " + name1 + ", " + age1);
        System.out.println("Person 2: " + name2 + ", " + age2);
    }
}

在上面的示例中,Person类包含一个name字段和一个age字段。getName()方法和getAge()方法返回的都是Optional对象。在main()方法中,我们创建了两个Person对象,一个包含name和age字段,另一个只包含age字段。我们使用orElse()方法获取name字段的值,如果name字段为null,则返回"Unknown"。我们还使用orElseThrow()方法获取age字段的值,如果age字段为null,则抛出RuntimeException异常。

运行上述代码,可以得到如下输出:

Person 1: Tom, 20
Person 2: Unknown, 25
Exception in thread "main" java.lang.RuntimeException: Age is missing.
    at Person.main(Person.java:23)

从输出可以看出,使用Optional类可以更加优雅地处理null值,并在运行时避免NullPointerException异常的出现。

除了使用orElse()和orElseThrow()方法来获取Optional对象中的值之外,我们还可以使用map()和flatMap()方法来对Optional对象中的值进行操作。例如,假设我们需要对一个Optional对象中的字符串进行大写转换,我们可以使用map()方法来实现:

Optional<String> optional = Optional.of("hello");
optional = optional.map(s -> s.toUpperCase());
System.out.println(optional.get()); // 输出"HELLO"

在上述示例中,我们使用of()方法创建了一个包含字符串"hello"的Optional对象。然后使用map()方法对字符串进行了大写转换。最后使用get()方法获取了转换后的字符串值。

除了map()方法之外,我们还可以使用flatMap()方法来对Optional对象进行操作。例如,假设我们有一个Optional对象,其中包含一个字符串,我们需要将这个字符串转换为一个包含多个字符的字符串列表,我们可以使用flatMap()方法来实现:

Optional<String> optional = Optional.of("hello");
List<String> list = optional.flatMap(s -> Optional.ofNullable(s.split(""))).map(Arrays::asList).orElse(Collections.emptyList());
System.out.println(list); // 输出"[h, e, l, l, o]"

在上述示例中,我们使用of()方法创建了一个包含字符串"hello"的Optional对象。然后使用flatMap()方法将字符串拆分成字符数组,并将字符数组转换为一个Optional对象。接着使用map()方法将字符数组转换为一个字符串列表。最后使用orElse()方法获取了转换后的字符串列表值。

总结

Java 8中的Optional类为处理可能为空的值提供了一种更加优雅的方式,并在运行时避免NullPointerException异常的出现。使用Optional类可以使代码更加健壮和安全。在使用Optional类时,应注意避免过度使用,以免增加代码复杂性和运行时间。

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

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

相关文章

Java 基础进阶篇(十)—— 泛型与可变参数

文章目录 一、泛型概述二、泛型的定义2.1 泛型类2.2 泛型方法2.3 泛型接口 三、泛型深入3.1 泛型通配符3.2 泛型上下限3.3 案例&#xff1a;定义一个 “所有车量进行比赛” 的方法 四、可变参数 一、泛型概述 泛型是 JDK5 中引入的特性&#xff0c;可以在编译阶段约束操作的数…

Linux应用开发:进程间通信 System V

目录 1、查看删除IPC对象 1.1 IPC对象 1.2 ipcs 命令查看系统中的 IPC 对象 1.3 ipcrm 命令删除系统中的 IPC 对象 2、共享内存 2.1 共享内存简介 2.2 共享内存相关API 2.2.1 shmget&#xff1a;创建共享内存 2.2.2 shmat&#xff1a;映射共享内存 2.2.3 shmdt&#…

A40i使用笔记:安装python3.7(素装)

一、前言 项目需求&#xff0c;要用到python3以上&#xff0c;就研究了一下如何安装python&#xff0c;这里也是分享出来安装方法&#xff0c;为各位技术研发人员减少不必要的时间损耗 本文没有安装python其他依赖库&#xff0c;因为我也是在摸索中&#xff0c;所以只限指导到…

「程序员的浪漫」使用 Html、Css、JavaScript 实现 DIY 生日祝福页面 快发给你的朋友吧

前言 从网上搜集整理修改的好用网页生日祝福版本 特点 将三剑客放进一个 Html 文件 点开即用封装好 修改几个参数就可以 DIYDIY 的地方有注释 预览 …省略几张图 源码 有用的话点个 star 不迷路谢谢&#xff01;https://github.com/yangzi0210/Happy-birthday-page

领先的项目协作管理软件OpenProject

本文软件由网友 不长到一百四誓不改名 推荐&#xff1b; 什么是 OpenProject &#xff1f; OpenProject 是一个开源、基于 Web 的项目管理系统&#xff0c;提供了免费的社区版和收费的企业版。OpenProject 拥有完善的文档&#xff0c;API&#xff0c;及丰富的功能&#xff0c;可…

SlickEdit for Windows and Linux crack

SlickEdit for Windows and Linux crack 现在可以在“新建注释”对话框中对颜色进行排序&#xff0c;使调色板中的颜色阵列看起来更符合逻辑。 在拆分或扩展行注释时添加了撤消步骤&#xff0c;这样您只需点击“撤消”一次即可撤消行注释扩展。 已更新VHDL颜色编码&#xff0c;…

【网络】- 计算机网络体系结构 - OSI七层模型、TCP/IP四层(五层)协议

目录 一、概述 二、计算机网络体系结构的形成  &#x1f449;2.1 分层的网络体系结构  &#x1f449;2.2 OSI 参考模型  &#x1f449;2.3 TCP/IP - 事实的国际标准 三、OSI 参考模型 四、TCP/IP 协议 一、概述 但凡学习计算机网络知识&#xff0c;肯定绕不过网络协议的&…

Java 基础进阶篇(八)—— 常用 API

文章目录 一、Object 类二、Objects 工具类三、Math 类四、System 类五、BigDecimal 类 一、Object 类 一个类要么默认继承了 Object 类&#xff0c;要么间接继承了 Object 类&#xff0c;Object 类是 java 中的祖宗类。Object 类的方法是一切子类都可以直接使用的。 因此&…

7.4 电子信息系统预处理中所用放大电路

在电子信息系统中&#xff0c;通过传感器或其它途径所采集的信号往往很小&#xff0c;不能直接进行运算、滤波等处理&#xff0c;必须进行放大。 一、仪表放大器 集成仪表放大器&#xff0c;也称为精密放大器&#xff0c;用于弱信号放大。 1、仪表放大器的特点 在测量系统中…

Binder“一次拷贝“你真懂吗?

前言 谈到到Binder相对于其他传统进程间通信方式的优点的时候&#xff0c;我们总会说Binder只需要做“一次拷贝”就行了&#xff0c;而其他传统方式需要“两次拷贝”。这确实是Binder的优点&#xff0c;但再进一步思考就会碰到两个问题&#xff1a; 这所谓的“一次拷贝”到底…

回溯算法简单介绍

目录 1.回溯算法简单介绍 2.回溯算法框架&#xff1a; 我们用一道题来详细讲解回溯算法的过程 3.全排列问题 1.回溯算法简单介绍 解决一个回溯问题&#xff0c;其实就是一个决策树的遍历过程&#xff0c;我们只需要思考三个问题&#xff1a; 1.路径&#xff1a;就是已经做出…

一起Talk Android吧(第五百四十二回:无进度值ProgressBar)

文章目录 概念介绍使用资源文件实现使用默认设置修改风格使用动画资源 使用代码实现经验总结 各位看官们大家好&#xff0c;上一回中咱们说的例子是"ProgressBar总结",本章回中介绍的例子是" 无进度值ProgressBar"。闲话休提&#xff0c;言归正转&#xf…

linux相关操作

1 系统调用 通过strace直接看程序运行过程中的系统调用情况 其中每一行为一个systemcall &#xff0c;调用write系统调用将内容最终输出。 无论什么编程语言都必须通过系统调用向内核发起请求。 sar查看进程分别在用户模式和内核模式下的运行时间占比情况&#xff0c; ALL显…

MySQL的where表达式中的各种运算符的用法和细节

MySQL的where表达式中的各种运算符的用法和细节 小故事mysql运算符分类where表达式中的运算符between and 和 and运算符的区别in运算符需要注意的点 小故事 今天在研究mysql的where表达式中的运算符的时候&#xff0c;遇到一个有意思的问题。 问题是&#xff1a;以id为主键&am…

玩机搞机----修改手机各项参数工具解析 过验证 变新机

任何的芯片原则上都可以修改当前机型的任何参数。包括但不限于高通 MTk 展讯..... 等其他芯片。众所周知&#xff0c;有的机型 有的版本可以直接修改&#xff0c;有的不行。至于具体原因可以参考我以往的帖子 安卓玩机搞机技巧综合资源-----修复基带 改串码 基带qcn 改相关参数…

三、c++学习(指针引用详解)

上一次直播好像过去很久了&#xff0c;中间有加班&#xff0c;有5 1假期等&#xff0c;现在5 1放假完了&#xff0c;所以继续卷。 C学习&#xff0c;b站直播视频 3.1 指针 这个指针&#xff0c;考虑了很久&#xff0c;一直不知道在哪个地方介绍&#xff0c;为啥纠结&#xf…

Solr(2):Solr的安装

1 安装前的概述 &#xff08;1&#xff09;solr是基于lucene而lucene是java写的&#xff0c;所以solr需要jdk----当前安装的solr-7.5需要jdk-1.8及以上版本&#xff0c;下载安装jdk并设置JAVA_HOME即可。 &#xff08;2&#xff09;下载solr&#xff0c;然后解压即可&#xf…

Map对象的用法(JS)

&#x1f4dd;个人主页&#xff1a;爱吃炫迈 &#x1f48c;系列专栏&#xff1a;数据结构与算法 &#x1f9d1;‍&#x1f4bb;座右铭&#xff1a;道阻且长&#xff0c;行则将至&#x1f497; 文章目录 MapkeyMap常用语法Map其他语法创建map的其他方式 Map Map是一个键值对形式…

FPGA设计之控制集优化详解

目录 一、前言 二、Control Set控制集 三、Control Set控制集优化 四、优劣 一、前言 在工程设计优化中&#xff0c;综合阶段优化中有一项常见的优化&#xff0c;控制集&#xff08;control set&#xff09;优化&#xff0c;在vivado的Synthesis中有对该配置项的解释&#x…

Android Jetpack组件化之ORM 数据库访问框架详解

一、对象关系映射 - ORM / Object Relational Mapping Android 系统中使用的数据库是 SQLite 关系型数据库 , 使用 Android 提供的 api 访问 SQLite 数据库非常繁琐 , 由此出现了很多 ORM 框架 ; ORM 英文全称 Object Relational Mapping , 对象关系映射 ; 对象关系映射 ORM …