《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.hqwc.cn/news/63713.html

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

相关文章

RFID工业识别技术:供应链智能化的科技颠覆

RFID工业识别技术&#xff0c;作为物联网的先锋&#xff0c;正在供应链管理领域展现着前所未有的科技颠覆。从物料追踪到库存管理&#xff0c;再到物流配送&#xff0c;RFID技术以其高效的数据采集和智能的自动化处理&#xff0c;彻底改变着传统供应链的运营方式。 RFID在物料追…

全国各城市-货物进出口总额和利用外资-外商直接投资额实际使用额(1999-2020年)

最新数据显示&#xff0c;全国各城市外商直接投资额实际使用额在过去一年中呈现了稳步增长的趋势。这一数据为研究者提供了对中国外商投资活动的全面了解&#xff0c;并对未来投资趋势和政策制定提供了重要参考。 首先&#xff0c;这一数据反映了中国各城市作为外商投资的热门目…

Prometheus入门

Prometheus(普罗米修斯) 是一种 新型监控告警工具,Kubernetes 的流行带动了 Prometheus 的应用。 全文参考自 prometheus 学习笔记(1)-mac 单机版环境搭建[1] Mac 上安装 Prometheus brew install prometheus 安装路径在 /usr/local/Cellar/prometheus/2.20.1, 配置文件在 /usr…

群晖安装wireguard(群晖7.1)

前言 上篇文章介绍了乌班图如何安装wireguard&#xff0c;但是感觉虚拟机安装有损优雅性。 本期视频我们介绍使用群晖安装wireguard。 由于原来黑群晖内核版本太低了。 我这里升级到群晖dns918&#xff08;7.1版本&#xff09; 内核版本为4.4 实际上这仍然不满足wireguar…

k8s之StorageClass(NFS)

一、前言 1、环境 k8s v1.23.5 &#xff0c;服务器是centos7.9 192.168.164.20 k8s-master1 192.168.164.30 k8s-node1 192.168.164.40 k8s-node2 2、貌似storageClass在kubernetes v1.20就被砍了。 因为它比较慢&#xff0c;而且耗资源&#xff0c;但可以通过不同的实现镜…

SpringBoot启动图标替换-banner文件

1.banner.txt文件内容如下 ${AnsiColor.BRIGHT_YELLOW}${AnsiStyle.BOLD}_________ .__ __________ __ / _____/____________|__| ____ ____\______ \ ____ _____/ |_ \_____ \\____ \_ __ \ |/ \ / ___\| | _//…

cmake扩展(1)——VS+CMake创建Qt项目

创建项目 创建CMakeLists #cmake最低版本 cmake_minimum_required(VERSION 3.10) #项目名 project(regextool)#查找所有*.h,*.ui,*.cpp文件&#xff0c;并存入SOURCES中 file(GLOB SOURCES "*.cpp" "*.ui" "*.h")#开启moc set(CMAKE_AUTOMOC O…

Leetcode33 搜索旋转排序数组

题解&#xff1a; /*** 旋转排序数组可分为N1 N2两个部分&#xff0c;如&#xff1a;[4,5,6,7,1,2,3]&#xff0c;N1为[4,5,6,7]&#xff0c;N2为[1,2,3]** 必然满足以下两个条件&#xff1a;* 1. N1和N2都是分别递增的&#xff1b;* 2. N1中的所有元素大于N2中的所有元素;** …

Python-OpenCV中的图像处理-颜色空间转换

Python-OpenCV中的图像处理-颜色空间转换 颜色空间转换获取HSV的值 颜色空间转换 在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会 发现我们经常用到的也就两种&#xff1a; BGR G r a y 和 B G R Gray 和 BGR Gray和BGRHSV。 注意&#xff1a;在 OpenCV 的…

8月9日上课内容 nginx反向代理与负载均衡

负载均衡工作当中用的很多的&#xff0c;也是面试会问的很重要的一个点 负载均衡&#xff1a;通过反向代理来实现&#xff08;nginx只有反向代理才能做负载均衡&#xff09; 正向代理的配置方法&#xff08;用的较少&#xff09; 反向代理的方式&#xff1a;四层代理与七层代…

三.SpringBoot整合Elasticsearch

SpringBoot整合Elasticsearch 前言一.java调用es的方式和工具二.java集成Elasticsearch-Rest-Client1.引入pom2.导入版本不一致问题3.编写配置类4.测试类4.1 执行前4.2 执行后 5.其他篇章 前言 我们整合es直接给es发请求就可以了&#xff0c;但是现在有很多方式去调用es的接口…

实战项目——多功能电子时钟

一&#xff0c;项目要求 二&#xff0c;理论原理 通过按键来控制状态机的状态&#xff0c;在将状态值传送到各个模块进行驱动&#xff0c;在空闲状态下&#xff0c;数码管显示基础时钟&#xff0c;基础时钟是由7个计数器组合而成&#xff0c;当在ADJUST状态下可以调整时间&…