揭秘Java 8新宠儿:初识Optional,让你的代码告别空指针烦恼

news2024/12/27 11:56:49

文章目录

  • 前言
  • 一、Optional基础
  • 二、使用步骤
    • 1.创建Optional实例
    • 1.常用方法


前言

        Java 8 引入了一个非常有用的类 Optional,它旨在减少空指针异常(NullPointerException)的发生。Optional 类是一个可以包含也可以不包含非null值的容器对象。如果值存在,isPresent() 方法将返回 true,调用 get() 方法将返回该对象。


一、Optional基础

        Optional是Java 8引入的一个容器类,它位于java.util包下。Optional类是一个可以为null的容器对象,用于解决空指针异常(NullPointerException)的问题。通过明确地使用Optional,程序可以更加清晰地表达一个值可能存在也可能不存在的情况,从而提高代码的健壮性和可读性。

主要特点和用途:

  • 避免空指针异常:Optional提供了一种更优雅的方式来处理可能为null的值,从而避免了在程序中频繁地进行空值检查。
  • 明确的存在性表示:Optional可以清晰地表示一个值是否存在,这比传统的null检查方式更加直观。
  • 链式调用:Optional提供了丰富的API,支持链式调用,从而使得代码更加简洁和易于维护。

二、使用步骤

1.创建Optional实例

        Optional类提供了几种创建实例的方法:

  • Optional.empty():创建一个空的Optional实例,不包含任何值。
  • Optional.of(T value):创建一个包含指定值的Optional实例。如果value为null,则抛出NullPointerException。
  • Optional.ofNullable(T value):创建一个可能包含null值的Optional实例。如果value为null,则返回一个空的Optional实例。

1.常用方法

  • isPresent():检查Optional实例中是否包含值。如果包含值,则返回true;否则返回false。
  • get():如果Optional实例包含值,则返回该值;否则抛出NoSuchElementException。
  • orElse(T other):如果Optional实例包含值,则返回该值;否则返回指定的默认值other。
  • orElseGet(Supplier<? extends T> other):如果Optional实例包含值,则返回该值;否则调用other提供的Supplier函数生成一个默认值。
  • orElseThrow(Supplier<? extends X> exceptionSupplier):如果Optional实例包含值,则返回该值;否则抛出由exceptionSupplier提供的异常。
  • ifPresent(Consumer<? super T> consumer):如果Optional实例包含值,则使用consumer对其执行操作。
  • map(Function<? super T, ? extends U> mapper):如果Optional实例包含值,则将其映射到另一个值上,并返回包含新值的Optional实例;否则返回一个空的Optional实例。
  • flatMap(Function<? super T, Optional> mapper):与map类似,但映射函数返回的是Optional类型,并且会自动扁平化。
import java.util.Optional;  
  
public class OptionalExample {  
    public static void main(String[] args) {  
        // 创建一个包含值的Optional  
        Optional<String> optionalString = Optional.of("Hello, Optional!");  
  
        // 使用isPresent()检查值是否存在  
        if (optionalString.isPresent()) {  
            System.out.println(optionalString.get()); // 输出: Hello, Optional!  
        }  
  
        // 使用orElse()提供默认值  
        String value = optionalString.orElse("Default Value");  
        System.out.println(value); // 输出: Hello, Optional!  
  
        // 使用map()进行转换  
        Optional<Integer> optionalLength = optionalString.map(String::length);  
        if (optionalLength.isPresent()) {  
            System.out.println("Length: " + optionalLength.get()); // 输出: Length: 15  
        }  
  
        // 创建一个空的Optional  
        Optional<String> emptyOptional = Optional.ofNullable(null);  
  
        // 使用orElseGet()  
        String emptyValue = emptyOptional.orElseGet(() -> "Value is not present");  
        System.out.println(emptyValue); // 输出: Value is not present  
  
        // 使用ifPresent()  
        emptyOptional.ifPresent(System.out::println); // 不会打印任何东西  
    }  
}

       Optional 是一种更好的处理可能为null的值的方式,但它并不应该被用作所有可能为null的字段的通用解决方案。在某些情况下,使用null来表示某些特定的业务逻辑状态可能是有意义的,而且直接处理null可能比引入Optional更简洁。然而,在API设计和返回值时,使用Optional可以清晰地表明一个值可能是可选的,从而避免了空指针异常。

“笑对人生,智慧同行!博客新文出炉,微信订阅号更新更实时,等你笑纳~”
在这里插入图片描述

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

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

相关文章

20240813在荣品RK3588S-AHD开发板的预置Android13中挂载ext4格式的256GB的TF卡

df -h mount fdisk无效 20240813在荣品RK3588S-AHD开发板的预置Android13中挂载ext4格式的256GB的TF卡 2024/8/13 11:24 缘起&#xff1a;当时比较便宜96.9&#xffe5;/想看看256GB的TF卡的高速卡的效果&#xff0c;就在京东入手了3张三星的高速TF卡。最近在弄RK3588S&#xf…

4款AI自动生成PPT神器,制作PPT太容易了

在当今数字化时代&#xff0c;无论是职场人士还是在校学生&#xff0c;PPT已经成为工作和学习中不可或缺的展示工具。从项目回顾到学术答辩&#xff0c;甚至是婚礼致辞&#xff0c;一份精心制作的PPT总能给人留下深刻印象。 为了帮助您更高效地完成PPT制作&#xff0c;我们将介…

数据科学、数据分析、人工智能必备知识汇总-----常用数据分析方法-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/140174015 文章目录 一、对比分析法1. 按时间和地区2. 同比和环比 二、分组分析法三、结构分析法四、交叉分析法五、矩阵分…

【话题】AI时代的程序员:挑战、机遇与核心竞争力的重塑

目录 人工智能时代&#xff0c;程序员如何保持核心竞争力&#xff1f; ​编辑引言 方向一&#xff1a;AI辅助编程对程序员工作的影响 案例 潜在的风险与对策 方向二&#xff1a;程序员应重点发展的核心能力 核心竞争力 如何培养这些能力 方向三&#xff1a;人机协作模式下的职业…

图论------贝尔曼-福德(Bellman-Ford)算法

算法概述&#xff1a; Bellman-Ford算法核心代码如下 for(int i 1;i<n-1;i) for(int j 1;j<m;j) if(dic[v[j]]> dic[u[j]] w[j]] dic[v[j]] dic[u[j]] w[j]; 首先我们要了解一个点就是我们这次不再使用邻接矩阵来存储图的信息&#xff0c;而是定义三个一维数组来…

Kubernetes之pod的污点和容忍度

污点和容忍度 污点&#xff08;Taint&#xff09;&#xff0c;它使节点能够排斥一类特定的 Pod。 容忍度&#xff08;Toleration&#xff09; 是应用于 Pod 上的&#xff0c;容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度&#xff1a;作为其功能的…

构建即时通讯应用:Spring boot高效集成WebSocket、Stomp协议完成前后端持续通信

1. 引入依赖 在你的Spring Boot项目的pom.xml中添加以下依赖&#xff1a; <dependencies><!-- Spring Boot Starter Thymeleaf --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf&…

黑龙江日报报道第5届中国计算机应用技术大赛,赛氪提供赛事支持

2024年7月17日&#xff0c;黑龙江日报、极光新闻对在哈尔滨市举办的第5届中国计算机应用技术大赛全国总决赛进行了深入报道。此次大赛由中国计算机学会主办&#xff0c;中国计算机学会计算机应用专业委员会与赛氪网共同承办&#xff0c;吸引了来自全国各地的顶尖技术团队和选手…

振德医疗选择泛微千里聆RPA,助力电商、人事业务流程自动化

振德医疗用品股份有限公司成立于1994年&#xff0c;中国A股上市公司&#xff0c;是医用敷料和感控防护产品主要的供应商之一。 &#xff08;图片素材来自振德医疗官网&#xff09; 振德医疗的业务在线上线下齐发力。目前拥有5个国内生产基地&#xff0c;3个海外工厂&#xff0…

算法分析报告:商江小智文本生成算法

1. 算法全周期分析 算法安全与监测 信息内容安全&#xff1a;算法通过预处理和特征提取确保输入数据的安全&#xff0c;避免敏感信息泄露。信息源安全&#xff1a;算法依赖于训练数据集&#xff0c;需确保数据来源的合法性和隐私保护。信息安全监测&#xff1a;算法应实时监控…

(回溯) LeetCode 17. 电话号码的组合

原题链接 一. 题目描述 17. 电话号码的字母组合 已解答 中等 相关标签 相关企业 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对…

Linux 下 ETCD 安装、配置与命令使用总结

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言&#xff1a; Linux 下 ETCD 安装、配置与命令使用总结 ETCD 是一个分布式键值存储系统&#xff0c;广泛用于服务发现、分布式锁、配置管理等场景&#xff0c;特别是在 Kubernetes 集群中发挥着至关重要的作用。ETCD 的高…

LoRA实现大模型LLM微调研究

LoRA&#xff0c;即低秩适应&#xff08;Low-Rank Adaptation&#xff09;&#xff0c;作为一种创新的微调方法&#xff0c;为大模型的优化与定制提供了一条高效、节省资源的新途径。 在快速发展的AI时代背景下&#xff0c;大型语言模型因其卓越的性能和广泛的应用前景&#xf…

(限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!

目录 haproxy七层代理详解一、负载均衡1.1 什么是负载均衡1.2 为什么使用负载均衡1.3 负载均衡类型1.3.1 硬件负载1.3.2 四层负载1.3.3 七层负载1.3.4 四层与七层的区别 二、haproxy介绍2.1 haproxy简介2.2 haproxy特性 三、haproxy详细部署3.1 实验所用的环境3.2 软件安装3.3 …

【每日一题】【数学推导】【分类讨论】小红的数组重排 牛客周赛 Round 55 C题 C++

牛客周赛 Round 55 C题 小红的数组重排 题目背景 牛客周赛 Round 55 题目描述 样例 #1 样例输入 #1 4 7 2 5 1样例输出 #1 YES 1 5 2 7样例 #1 样例输入 #1 6 1 1 4 5 1 4样例输出 #1 NO做题思路 a 1 ∗ a 2 < a 2 ∗ a 3 < . . . < a n − 1 ∗ a n a_1*a_…

【Kettle】kettle连接MySQL数据库连接不上解决方案汇总

前言 近期项目上经常用到ETL&#xff08;数据抽取转换加载&#xff09;&#xff0c;就想到了之前用过的kettle工具&#xff0c;下班回家想着再玩玩这个工具吧&#xff0c;结果在连接MySQL时&#xff0c;遇到了各种问题&#xff0c;就顺手整理记录一下。所以今天晚上的主题是&a…

SuccBI+低代码文档中心 — 可视化分析(仪表板)(上)

有关仪表板的设计器&#xff1a; 查询设置 由于仪表板的设计器是所见即所得的&#xff0c;可以将当前制作的内容和数据的查询结果实时展示在界面中&#xff0c;当引入到仪表板的模型数据量较大时&#xff0c;为了提高设计器界面的查询性能&#xff0c;提供了以下两种方法&…

PythonStudio 控件使用常用方式(二十一)TTrayIcon

PythonStudio是一个极强的开发Python的IDE工具&#xff0c;官网地址是&#xff1a;https://glsite.com/ &#xff0c;在官网可以下载最新版的PythonStudio&#xff0c;同时&#xff0c;在使用PythonStudio时&#xff0c;它也能及时为用户升到最新版本。它使用的是Delphi的控件&…

SSL发送邮件:如何确保邮件传输过程安全?

SSL发送邮件的安全性评估&#xff1f;SSL发送邮件的条件有哪些&#xff1f; 使用SSL发送邮件是一种有效的措施&#xff0c;能够确保邮件在传输过程中的安全性。AokSend将探讨SSL发送邮件的关键技术及其重要性&#xff0c;帮助您更好地理解如何确保邮件传输过程的安全。 SSL发…

米思奇安装——Mac版本

米思奇安装——Mac版本 1.下载 访问米思奇官网https://mixly.org/bnu-maker/mixl2.0rc 打开官网后在首页点击导航栏的软件平台&#xff0c;选择Mixly离线版 点击Mixly2.0RC4发布下载。 进入百度网盘分享的文件&#xff0c;选择Mac一键更新版本&#xff0c;等待下载完成。 …