《Java-SE-第三十四章》之Optional

前言

在你立足处深挖下去,就会有泉水涌出!别管蒙昧者们叫嚷:“下边永远是地狱!”

博客主页:KC老衲爱尼姑的博客主页

博主的github,平常所写代码皆在于此

共勉:talk is cheap, show me the code

作者是爪哇岛的新手,水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!


文章目录

  • Optional介绍
    • Optional的构造方法
      • 1. Optional.of(T value)
      • 2. Optional.ofNullable(T value)
      • 3. Optional.empty()
    • 常用方法介绍
      • 1. ifPresent
      • 2. orElse
      • 3. orElseGet
      • 4. orElseThrow
      • 5. isPresent
      • 6. **map**

Optional介绍

我们平时写代码的时候遇到最多的异常就是空指针,所以很多时候就需要做各种非空判断,而过多的判断会导致代码臃肿,所以JDK8中引用了Optional,它是java.util包下的一个用于代替null 的一个工具类,使该类可以有效的避免空指针异常。

Optional的构造方法

Optional提供了三个静态方法来构造出一个Optional

1. Optional.of(T value)

该方法会接收一个非空的value来构造出optaional.返回的Opational包含value这个值。对于此方法的参数一定不能为null,否则会抛出空指针异常。

定义一个用户类便于后面使用

@Data
@AllArgsConstructor
public class User {private String username;private String password;
}

Optional.of演示使用


import org.example.Functional.model.User;import java.util.Optional;public class Demo7 {public static void main(String[] args) {User user = null;//无论传入方法的是不是null都不会出问题Optional<User> user1 = getUser();}private static Optional<User> getUser() {User user = new User("张三","12");//该方法传入的时候会抛出异常return Optional.of(null);}
}

运行结果:

给该方法传入null会报空指针异常,所以正确的使用是传非空的值


import org.example.Functional.model.User;import java.util.Optional;public class Demo7 {public static void main(String[] args) {User user = null;//无论传入方法的是不是null都不会出问题Optional<User> user1 = getUser();user1.ifPresent(user2 -> System.out.println(user2.getUsername()));//输出张三}private static Optional<User> getUser() {User user = new User("张三","12");//该方法传入null的时候会抛出异常return Optional.of(user);}
}

2. Optional.ofNullable(T value)

该方法和of的最大区别就是参数可以传入null

代码演示

import org.example.Functional.model.User;import java.util.Optional;public class Demo7 {public static void main(String[] args) {Optional<User> user = Optional.ofNullable(getUser());user.ifPresent(user2-> System.out.println(user2.getUsername()));//输出张三Optional<User> user2 = Optional.ofNullable(null);user2.ifPresent(user3-> System.out.println(user3.getUsername()));//不会出错}private static User getUser() {User user = new User("张三","12");return user;}
}    

3. Optional.empty()

​ 如果一个方法的返回值类型是Optional类型。而如果我们经判断发现某次计算得到的返回值为null,这个时候就需要把null封装成Optional对象返回。这时则可以使用Optional静态方法empty来进行封装。

代码演示

public class Demo7 {public static void main(String[] args) {Optional<User> user = getUser();user.ifPresent(user2-> System.out.println(user2.getUsername()));Optional<Object> empty = Optional.empty();System.out.println();}private static Optional<User> getUser() {User user = new User("张三","12");//返回的类型为Optional<User>,返回之前是无法保证这个对象一定是非空,所以当可能是null时,我们//返回一个Optional.empty()return user==null?Optional.empty(): Optional.of(user);}
}

调试结果

在这里插入图片描述

Optional.empty()会返回一个value为null的 Optional。我们使用构造Optional对象时,传入不为null的对象时,该对象存储在Optional中的value中。

常用方法介绍

1. ifPresent

我们获取到一个Optional对象后肯定需要对其中的数据进行使用。这时候我们可以使用其ifPresent方法对来消费其中的值。这个方法会判断其内封装的数据是否为空,不为空时才会执行具体的消费代码。这样使用起来就更加安全了。

示例代码

public class Demo7 {public static void main(String[] args) {User user = new User("张三","12");Optional<User> user1 = Optional.ofNullable(user);user1.ifPresent(user2-> System.out.println(user));User user2 = null;Optional<User> user3 = Optional.ofNullable(user2);user3.ifPresent(user4-> System.out.println(user));//啥也不干}
}

2. orElse

如果 Optional 中有值则将其返回,否则返回 orElse 方法传入的参数。但是无论 Optional 是否包含值,orElse 方法的参数都会被求值,也就是说,无论如何都会执行默认值的生成。

示例代码

public class Demo7 {public static void main(String[] args) {User user = new User("张三","12");Optional<User> user1 = Optional.ofNullable(user);Optional<User> empty = Optional.empty();User user2 = user1.orElse(new User("default","default"));User user3 = empty.orElse(new User("NULL","NULL"));System.out.println(user2);System.out.println(user3);}
}    

运行结果:
在这里插入图片描述

3. orElseGet

类似于orElse,不同的是只有在 Optional不包含值时,才会调用该函数来生成默认值。这可以提高性能,因为默认值的生成只在需要时才会发生。

示例代码

public class Demo7 {public static void main(String[] args) {User user = null;Optional<User> user1 = Optional.ofNullable(user);User user2 = user1.orElseGet(() -> new User("dufault", "default"));System.out.println(user2);}
}    

4. orElseThrow

获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出。

示例代码

public class Demo7 {public static void main(String[] args) {User user = new User("张三","12");Optional<User> user1 = Optional.ofNullable(user);try {User user3 = user1.orElseThrow((Supplier<Throwable>) () -> new RuntimeException("user为空"));System.out.println(user3);} catch (Throwable e) {throw new RuntimeException(e);}}}   

5. isPresent

​ 我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空,返回值为true。但是这种方式并不能体现Optional的好处,更推荐使用ifPresent方法

示例代码

public class Demo7 {public static void main(String[] args) {User user = new User("张三","12");Optional<User> user1 = Optional.ofNullable(user);if (user1.isPresent()) {System.out.println("user不为null");}else {System.out.println("user为null");}}
}    

6. map

​ Optional还提供了map可以让我们的对数据进行转换,并且转换得到的数据也还是被Optional包装好的,保证了我们的使用安全。

示例代码

public class Demo7 {public static void main(String[] args) {User user = new User("张三","12");Optional<User> user1 = Optional.ofNullable(user);Optional<String> s = user1.map(user2 -> user2.getUsername());s.ifPresent(s2-> System.out.println(s2));}
}    

各位看官如果觉得文章写得不错,点赞评论关注走一波!谢谢啦!。

在这里插入图片描述

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

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

相关文章

C#小轮子:Visual Studio自动编译Sass文件

文章目录 前言插件安装插件使用compilerconfig.jsonsass输入和css输出&#xff08;自动生成&#xff09;默认配置&#xff08;我不懂就不去动他了&#xff09; 前言 我们知道css文件用起来太麻烦&#xff0c;如果样式一多&#xff0c;嵌套起来用css样式就眼花缭乱。Sass使用层…

Kafka的下载和安装

一、Kafka下载和安装 下载地址&#xff1a;https://kafka.apache.org/downloads 下载完毕解压即可 linux解压命令tar -zxvf kafka_2.13-3.5.1.tgz&#xff0c;linux环境下指令是在\kafka_2.13-3.5.1\bin目录。 windows直接解压即可&#xff0c;windows环境下指令是在kafka_2.…

强化学习-信任区域策略优化和近端策略优化(第7章)

来源书籍&#xff1a; TENSORFLOW REINFORCEMENT LEARNING QUICK START GUIDE 《TensorFlow强化学习快速入门指南-使用Python动手搭建自学习的智能体》 著者&#xff1a;[美]考希克巴拉克里希南&#xff08;Kaushik Balakrishnan&#xff09; 译者&#xff1a;赵卫东 出版…

Rust 编程小技巧摘选(7)

目录 Rust 编程小技巧(7) 1. 交换变量 2. 翻转数组 3. for_each() 用法 4. 结构体 Display trait 5. HashMap 和 BTreeMap 6. 遍历输出哈希表 7. 分离奇数和偶数 8. 判断素数&#xff08;质数&#xff09; Rust 编程小技巧(7) 1. 交换变量 与python, go等语言用法类…

计算机网络:网络字节序

目录 一、字节序1.字节序概念2.字节序的理解&#xff08;1&#xff09;大端模式存储数据&#xff08;2&#xff09;小端模式存储数据 二、网络字节序 一、字节序 1.字节序概念 字节序&#xff1a;内存中存储多字节数据的顺序。 难道存储数据还要看顺序吗&#xff1f; yes。内…

【将回声引入信号中】在语音或音频文件中引入混响或简单回声,以研究回声延迟和回波幅度对生成的回波信号感知的影响(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Java 正则表达式【匹配与分组基本原理】

简介 我们一般使用正则表达式是用来处理字符串的&#xff0c;不管是实际的开发中还是我们的算法竞赛中&#xff0c;使用正则表达式绝对可以大大提升我们的效率。 正则表达式&#xff08;regular expression&#xff09;其实就是对字符串进行模式匹配的技术。 快速入门 我们这里…

第三篇|金融人数据来源有哪些

数据对于金融行业真的很重要&#xff0c;那么金融人有哪些途径查数据呢&#xff1f; 国内&#xff1a; 1. 国家统计局 这个应该是无论什么行业都使用最频繁的网站&#xff0c;每个月都会固定发上个月资产投资数据 、工业增加值和利润数据等常规数据&#xff0c;其他数据也会…

什么是分布式系统,如何学习分布式系统

正文 虽然本人在前面也写过好几篇分布式系统相关的文章&#xff0c;主要包CAP理论&#xff0c;分布式储存与分布式事务&#xff0c;但对于分布式系统&#xff0c;并没有一个跟清晰的概念。分布式系统涉及到很多的技术、理论与协议&#xff0c;很多人也说&#xff0c;分布式系统…

Docker 安装和架构说明

Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的Linux内核环境。 Docker实质上是在已经运行的Liunx下制造了一个隔离的文件环境&#xff0c;因此他的执行效率几乎等同于所部署的linux主机。因此Docker必须部署在Linux内核系统上。如果其他系统想部署Docke…

hutool 导出复杂表头excel

假如已这样的表头导出数据 1.把包含表头的excel添加到项目资源目录 2.编写代码读取表头所在sheet,并且加入需导出的数据 /*** 导出excel*/public static void downloadExcel(List<List<Object>> list, HttpServletResponse response) throws IOException {/*Strin…

wpf 3d 坐标系和基本三角形复习

wpf 3d 坐标系的描述见此&#xff0c; WPF 3d坐标系和基本三角形_wpf 坐标系_bcbobo21cn的博客-CSDN博客 X轴正向向右&#xff0c;Y轴正向向上&#xff1b;Z轴&#xff0c;正向是从屏幕里边出来&#xff0c;负向是往屏幕里边去&#xff1b;坐标原点是在呈现区域的中心&#x…

知识付费系统开发:构建高效智能的付费内容平台

随着数字化时代的来临&#xff0c;知识付费正迅速崭露头角&#xff0c;为知识创作者和求知者带来了全新的商机。在这个背景下&#xff0c;开发一款高效智能的知识付费系统成为了一项重要的任务。本文将深入探讨如何基于Python编程语言和相关技术构建一个智能的知识付费内容平台…

mac arm 通过brew搭建 php+nginx+mysql+xdebug

1.安装nginx brew install nginx //安装brew services start nginx //启动2.安装php brew install php7.4 //安装export PATH"/opt/homebrew/opt/php7.4/bin:$PATH" //加入环境变量 export PATH"/opt/homebrew/opt/php7.4/sbin:$PATH"brew serv…

【百度翻译api】中文自动翻译为英文

欸&#xff0c;最近想做一些nlp的项目&#xff0c;做完了中文的想做做英文的&#xff0c;但是呢&#xff0c;国内爬虫爬取的肯定都是中文 &#xff0c;爬取外网的技术我没有尝试过&#xff0c;没有把握。所以我决定启用翻译&#xff0c;在这期间chatGPT给了我非常多的方法&…

【枚举】CF1660 D

Problem - 1660D - Codeforces 题意&#xff1a; 思路&#xff1a; 思路巨简单&#xff0c;代码也wa了很多发才过&#xff0c;都是因为细节.... 很显然&#xff0c;要根据0分段处理 对于每一段&#xff0c;枚举去掉左边段还是右边段&#xff0c;左边段是 l 到第一个负数&am…

网络加速与文件传输软件:如何通过优化网络提升文件传输速度

在信息化社会&#xff0c;文件传输是人们生活和工作中必不可少的一个环节。但是&#xff0c;由于网络环境的多样性和传输过程中可能出现的各种问题&#xff0c;文件传输速度经常受到影响。因此&#xff0c;如何优化网络以提高文件传输速度成为了一个重要的课题。本文将探讨网络…

力扣:59. 螺旋矩阵 II(Python3)

题目&#xff1a; 给你一个正整数 n &#xff0c;生成一个包含 1 到 n2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全…

windows使用/服务(13)戴尔电脑怎么设置通电自动开机

戴尔pc机器通电自启动 1、将主机显示器键盘鼠标连接好后&#xff0c;按主机电源键开机 2、在开机过程中按键盘"F12",进入如下界面&#xff0c;选择“BIOS SETUP” 3、选择“Power Management” 4、选择“AC Recovery”&#xff0c;点选“Power On”&#xff0c;点击“…

解决:django设置DEBUG=false时出现的问题

首先&#xff0c;我用的是django4.2&#xff0c;python3.10版本 本来&#xff0c;如果在settings.py中使用 DEBUG True&#xff0c;那么什么问题也没有&#xff0c;当然&#xff0c;这属于调试模式。 DEBUG True TEMPLATE_DEBUG DEBUGSTATIC_URL /static/ STATICFILES_DI…