java基础之Java8新特性-Optional

目录

1.简介

2.Optional类常用方法

3.示例代码

4.示例代码仓库地址


1.简介

Java 8引入了一个重要的新特性,即Optional类。Optional类是为了解决空指针异常而设计的。

在Java中,当我们尝试访问一个空对象的属性或调用其方法时,很容易抛出NullPointerException。这种异常可能会导致程序崩溃或产生意外结果。

Optional类的目的是提供一种更好的处理空值的方式。它可以包含一个非空的对象,也可以表示一个空值。使用Optional类,我们可以避免直接操作空对象,从而减少NullPointerException的发生。

2.Optional类常用方法

后面的示例代码主要用到map、orElse、ifPresent方法

1.map(Function<? super T,? extends U> mapper):如果Optional对象包含一个非空的值,则将该值应用给定的函数进行转换,并返回一个新的Optional对象,用于存储转换后的结果;否则返回一个空的Optional对象。

2.ofNullable(T value):如果value不为null,则返回一个包含该value的Optional对象;否则返回一个空的Optional对象。

3.isPresent():如果Optional对象包含一个非空的值,则返回true;否则返回false。

4.get():如果Optional对象包含一个非空的值,则返回该值;否则抛出NoSuchElementException异常。

5.orElse(T other):如果Optional对象包含一个非空的值,则返回该值;否则返回other。

6.ifPresent(Consumer<? super T> consumer):如果Optional对象包含一个非空的值,则对该值执行给定的操作;否则不做任何操作。

3.示例代码

我们来看一段代码

public static void main(String[] args) {

        User user=null;
        //模拟不确定的空对象
        Random random = new Random();
        if(random.nextInt(11)>5){
           user= new User("Bob");
        }
        
        //把名字转成小写
        user.setName(user.getName().toLowerCase());
        System.out.println(user.getName());

    }

在这段代码中存在潜在的空指针异常风险。如果随机数小于等于5,则 user 对象为 null,调用 user.getName() 方法会导致空指针异常。

应该在调用 getName() 方法前先进行非空判断。

我们先看传统的手动判空处理

 public static void main(String[] args) {

        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }

        // 把名字转成小写
        if (user != null && user.getName() != null) {
            user.setName(user.getName().toLowerCase());
            System.out.println(user.getName());
        } else {
            System.out.println("用户对象为空或用户名为空");
        }
    }

相较于这种传统的手动判空方法我们可以使用更优雅的方法Optional

  public static void main(String[] args) {
        User user = null;
        // 模拟不确定的空对象
        Random random = new Random();
        if (random.nextInt(11) > 5) {
            user = new User("Bob");
        }

        // 使用Optional类来包装空对象
        //Lambda表达式链式处理写法
        Optional<String> optionalS1 = Optional.ofNullable(user).map(u->u.getName()).map(name->name.toLowerCase());
        // 输出结果,若空则设置默认值为MiJiu
        System.out.println(optionalS1.orElse("MiJiu"));
        //非空则输出结果
        optionalS1.ifPresent(s->System.out.println(s));

        System.out.println("--------------------------------");

        //用方法引用简化
        Optional<String> optionalS2 = Optional.ofNullable(user).map(User::getName).map(String::toLowerCase);
        System.out.println(optionalS2.orElse("MiJiu"));
        optionalS1.ifPresent(System.out::println);


    }

有关什么是Lambda表达式可以看这篇

java基础之Java8新特性-Lambda-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135395534?spm=1001.2014.3001.5502

有关什么是方法引用可以看这篇

java基础之Java8新特性-方法引入-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_62262918/article/details/135469298?spm=1001.2014.3001.5502

4.示例代码仓库地址

j8-new-feature: java8新特性示例Demo (gitee.com)​编辑https://gitee.com/mi9688-wine/j8-new-featureicon-default.png?t=N7T8https://gitee.com/mi9688-wine/j8-new-feature

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用 1、不用交叉验证的情况&#xff1a; from __future__ import print_function from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.neighbors import KNeighborsClassifieriris…

centos7下升级nginx1.8.0版本到nginx1.25.3版本

1、指定目录下载安装包 wget http://nginx.org/download/nginx-1.25.3.tar.gz 2、重命名老版本nginx目录 cd /usr/local/ mv nginx nginx_1.8.0 3、解压更新版本的压缩包 tar -zxvf nginx-1.25.3.tar.gz 4、进入nginx安装包目录下执行如下命令检测系统环境 --with-stream: 添…

Citrix思杰虚拟桌面离场,国产云桌面是否应继续对接微软Windows AD域?

2023年&#xff0c;12月3日&#xff0c;Citrix&#xff08;思杰&#xff09;全面退出中国市场。Citrix进入中国市场时&#xff0c;定位是大客户、高价值企业&#xff0c;客户群集中在国企、大型制造业、外资、金融等中大型企业&#xff0c;例如华为、中国移动、平安银行、建设银…

【Python】编程练习的解密与实战(二)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《Python | 编程解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1fa90;1. 初识Python …

【IC设计】ICer‘s 乾坤大挪移——FSM状态机

目录 理论解读写几段式状态机&#xff1f; 设计实战两种state的FSM&#xff08;异步复位&#xff09; 理论解读 写几段式状态机&#xff1f; 设计实战 两种state的FSM&#xff08;异步复位&#xff09; 实现下图所示的摩尔状态机&#xff0c;复位为异步复位。 代码实现&am…

【笔记】书生·浦语大模型实战营——第三课(基于 InternLM 和 LangChain 搭建你的知识库)

【参考&#xff1a;tutorial/langchain at main InternLM/tutorial】 【参考&#xff1a;(3)基于 InternLM 和 LangChain 搭建你的知识库_哔哩哔哩_bilibili-【OpenMMLab】】 笔记 基础作业 这里需要等好几分钟才行 bug&#xff1a; 碰到pandas相关报错就卸载重装 输出文字…

c语言实现HashTable

概念&#xff1a;哈希表是一种数据结构&#xff0c;它通过将键映射到数组的某个位置来存储和检索值。 第一步&#xff0c;首先定义节点 typedef struct Node {char *key;int value;struct Node *next; } Node; 这里&#xff0c;我定义的键是字符&#xff0c;value是整数。 …

赋能智慧农业生产,基于YOLOv7开发构建农业生产场景下油茶作物成熟检测识别系统

AI赋能生产生活场景&#xff0c;是加速人工智能技术落地的有利途径&#xff0c;在前文很多具体的业务场景中我们也从实验的角度来尝试性地分析实践了基于AI模型来助力生产生活制造相关的各个领域&#xff0c;诸如&#xff1a;基于AI硬件实现农业作物除草就是一个比较熟知的场景…

【大数据进阶第三阶段之DolphinScheduler学习笔记】深度解析DolphinScheduler(海豚调度)

1、简介 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系&#xff0c;并为应…

YOLOv5改进 | 检测头篇 | DynamicHead支持检测和分割(不同于网上版本,全网首发)

一、本文介绍 本文给大家带来的改进机制是DynamicHead(Dyhead),这个检测头由微软提出的一种名为“动态头”的新型检测头,用于统一尺度感知、空间感知和任务感知。网络上关于该检测头我查了一些有一些魔改的版本,但是我觉得其已经改变了该检测头的本质,因为往往一些细节上才…

程序设计语言的基本成分

程序设计语言的基本成分 1、程序设计语言的数据成分2、程序设计语言的运算成分3、程序设计语言的控制成分4、程序设计语言的传输成分 程序设计语言的基本成分包括数据、运算、控制和传输等。 1、程序设计语言的数据成分 程序设计语言的数据成分指一种程序设计语言的数据类型。数…

最实用的 8 个免费 Android 数据恢复软件

如果您正在寻找最好的免费 Android 数据恢复软件&#xff0c;那就不用再犹豫了&#xff0c;因为我已经列出了最好的软件。不可否认&#xff0c;智能手机和平板电脑等 Android 设备正在与技术一起发展。与以前相比&#xff0c;它们也更加融入了我们的日常生活。 Android 智能手…

软件测试|Python urllib3库使用指南

简介 当涉及到进行网络请求和处理HTTP相关任务时&#xff0c;Python的urllib3库是一个强大且灵活的选择。它提供了一种简单的方式来执行HTTP请求、处理响应和处理连接池&#xff0c;使得与Web服务进行交互变得更加容易。本文将详细介绍如何使用urllib3库进行网络请求。 安装u…

Prettier、EditorConfig插件安装及配置文件讲解

安装 Prettier 我们在编写代码时&#xff0c;代码的格式规范非常重要&#xff0c;能提高代码的可读性&#xff0c;避免由于格式问题引起的 bug&#xff0c;也有利于多人协作开发时的统一风格。Prettier是一个非常好用的代码格式化工具&#xff0c;能自动格式化代码&#xff0c;…

「 网络安全术语解读 」点击劫持Clickjacking详解

引言&#xff1a;要想深入理解点击劫持攻击&#xff0c;我们需要先清楚iframe的用途及优缺点。 1. 关于iframe iframe是HTML语言中的一部分&#xff0c;通常用于在网页中嵌入其他网页的内容&#xff0c;如图像、视频、音频、链接等。它允许在一个网页中插入另一个网页&#xf…

meshlab点云平滑

文章目录 深度平滑拉普拉斯平滑Taubin 平滑其他改进的拉普拉斯平滑 Meshlab界面认识 创建几何对象 Meshlab在Filters->Smoothing, Fairing and deformation中&#xff0c;提供了许多滤波工具&#xff0c;其中与平滑滤波相关的列表如下&#xff0c;本节中所有用到的工具均来…

2019年认证杯SPSSPRO杯数学建模B题(第一阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于方差分布的方法对未知语言文本中重复片段的自动搜索问题的研究 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但…

C++面试宝典第18题:旋转数组

题目 给定一个数组,将数组中的元素向右移动k个位置,其中k是非负数。要求如下: (1)尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 (2)使用时间复杂度为O(n)和空间复杂度为O(1)的原地算法解决这个问题。 示例 1: 输入: [1, 2, 3, 4, 5, 6, 7] 和 k…

GPT function calling v2

原文&#xff1a;GPT function calling v2 - 知乎 OpenAI在2023年11月10号举行了第一次开发者大会&#xff08;OpenAI DevDays&#xff09;&#xff0c;其中介绍了很多新奇有趣的新功能和新应用&#xff0c;而且更新了一波GPT的API&#xff0c;在1.0版本后的API调用与之前的0.…

MySQL 从零开始:02 MySQL 安装

文章目录 1、下载 MySQL 安装程序2、安装 MySQL 要操作 MySQL &#xff0c;首先要安装 MySQL &#xff0c;本文将一步步展示如何安装 MySQL&#xff0c;简直详细到令人发指。 环境&#xff1a; 操作系统&#xff1a;Windows10 64位MySQL版本&#xff1a;社区版 8.0.11.0 1、下…
最新文章