当前位置: 首页 > news >正文

Optional使用详解

Optional使用详解

文章目录

  • Optional使用详解
      • 1.构造函数
      • 2.Optional.of(T value)
        • 作用
        • 使用
        • 源码(只想知道怎么用的可以略过)
      • Optional.ofNullable(T value)
        • 作用
        • 使用
        • 源码
      • .orElse(T other)
        • 作用
        • 使用
        • 源码
      • .orElseGet(Supplier<? extends T> other)
        • 作用
        • 使用
        • 源码
      • .map(Function<? super T, ? extends U> mapper)
        • 作用
        • 使用
        • 源码
      • isPresent()
        • 作用
        • 使用
        • 源码
      • ifPresent(Consumer<? super T> consumer)
        • 作用
        • 使用
        • 源码
      • filter(Predicate<? super T> predicate)

为了防止空指针报错NullPointerException,一我们都会加上if,else,想让代码变得更优雅,JAVA8提供了Optional类来优化这种写法

1.构造函数

构造函数使用private修饰,不能直接被外部访问(没办法new出来),Optional的本质,就是内部储存了一个真实的值,在构造的时候,就直接判断其值是否为空。下面为源码

/*** Constructs an instance with the value present.** @param value the non-null value to be present* @throws NullPointerException if value is null*/private Optional(T value) {this.value = Objects.requireNonNull(value);}//requireNonNull()方法public static <T> T requireNonNull(T obj) {//使用构造函数创建对象,value为null则报空指针if (obj == null)throw new NullPointerException();return obj;}

2.Optional.of(T value)

一般推荐使用Optional.ofNullable(T value),在实际生产中很少使用of()方法,因为使用of()方法,value为null时会报出空指针。不过已有一些场景会用到,比如一些需要空指针暴露的接口或测试类中。

作用

  • 当value值为空时,依然会报NullPointerException
  • 当value值不为空时,能正常构造Optional对象。

使用

//1.当 str=null,报空指针
String str = null;
Optional<String> str1 = Optional.of(str);

源码(只想知道怎么用的可以略过)

   public static <T> Optional<T> of(T value) {//构造函数创建对象return new Optional<>(value);}//构造函数private Optional(T value) {this.value = Objects.requireNonNull(value);}//requireNonNull()方法public static <T> T requireNonNull(T obj) {//若传入的value为null,则报空指针if (obj == null)throw new NullPointerException();return obj;}

Optional.ofNullable(T value)

与of(T value)最大的区别就是,value可以为空,推荐使用

作用

  • 当value值为空时,不会报空指针。
  • 当value值不为空时,能正常构造Optional对象。

使用

String str = null;
//str为空时不会报空指针
Optional<String> str2 = Optional.ofNullable(str);

源码

    public static <T> Optional<T> ofNullable(T value) {//value为null时,执行empty()方法return value == null ? empty() : of(value);}public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")//返回EMPTY对象Optional<T> t = (Optional<T>) EMPTY;return t;}// EMPTY对象化就是new Optional<>private static final Optional<?> EMPTY = new Optional<>();

.orElse(T other)

作用

如果有值则将其返回,否则返回指定的other对象。

  • 传入的值为null时,执行other并返回
  • 传入的值不为null时,执行other,返回传入的值

使用

执行以下代码,控制台输出Hello被执行了,可见,传入的vaule不为null,但是t.rousHello()依然执行。

    public  String rousHello() {System.out.println("Hello被执行了");return "Hello!!!";}  public static void main(String[] args) {test1 t=new test1();String s = Optional.ofNullable("Str").orElse(t.rousHello());}

源码

    public T orElse(T other) {//value为ofNullable(T vaule)的value,vaule不为空,返回balue,否则执行otherreturn value != null ? value : other;}

.orElseGet(Supplier<? extends T> other)

比较推荐使用

作用

  • orElse()一定会被执行,而orElseGet()只有传入的参数为null时才会被执行

  • 只有传入的参数为null情况才才会执行orElseGet()内容

使用

   public  String rousHello() {System.out.println("Hello被执行了");return "Hello!!!";}
String s = Optional.ofNullable(str).orElseGet(() -> t.rousHello());

源码

    public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();}

.map(Function<? super T, ? extends U> mapper)

作用

不会返回空指针的获取对象属性

使用


//例如User中有个Address属性,Address对象中有详细地址
public String getCity(User user) throws Exception{return Optional.ofNullable(user).map(u-> u.getAddress()).map(a->a.getCity()).orElseThrow(()->new Exception("获取用户地址失败!"));
}

源码

   public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {//1.为空则报空指针错误(前面讲过)Objects.requireNonNull(mapper);//不存在,返回EMPTY对象(前面讲过)if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}}//requireNonNull()方法public static <T> T requireNonNull(T obj) {//若传入的value为null,则报空指针if (obj == null)throw new NullPointerException();return obj;}

isPresent()

作用

  • 判断是否存在.不存在返回false,存在返回true

使用

boolean present = Optional.ofNullable(user).isPresent();

源码

源码很容易理解,直接判断value是否!=null

    public boolean isPresent() {return value != null;}

ifPresent(Consumer<? super T> consumer)

作用

  • 如果存在,则往下走

使用

//如果user存在,则覆盖user的age和name属性       
Optional.ofNullable(user).ifPresent(u->{u.setAge(100);u.setName("ifPresent");});

源码

   public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);}

filter(Predicate<? super T> predicate)

作用

  • 如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

使用

        user.setName("张四");//此处会报空指针,因为get()方法在value为null的情况下会报空指针User user1 = Optional.ofNullable(user).filter(u -> u.getName() == "张三").get();Optional<User> user2 = Optional.ofNullable(user).filter(u -> u.getName() == "张三");user2.ifPresent(u->u.setAge(99));

源码

    public Optional<T> filter(Predicate<? super T> predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();}

相关文章:

Optional使用详解

Optional使用详解 文章目录Optional使用详解1.构造函数2.Optional.of(T value)作用使用源码&#xff08;只想知道怎么用的可以略过&#xff09;Optional.ofNullable(T value)作用使用源码.orElse(T other)作用使用源码.orElseGet(Supplier<? extends T> other)作用使用源…...

如何实现文件高速传输,推荐镭速高速文件传输解决方案

随着互联网的发展&#xff0c;文件传输越来越频繁&#xff0c;如何实现文件高速传输已经越来越成为企业发展过程中需要解决的问题&#xff0c; 在当今的业务中&#xff0c;随着与客户和供应商以及内部系统的所有通信的数据量不断增加&#xff0c;对高速文件传输解决方案的需求…...

SpringBoot整合Mybatis+人大金仓(kingbase8)

陈老老老板&#x1f9b8;&#x1f468;‍&#x1f4bb;本文专栏&#xff1a;国产数据库-人大金仓&#xff08;kingbase8&#xff09;&#xff08;主要讲一些人大金仓数据库相关的内容&#xff09;&#x1f468;‍&#x1f4bb;本文简述&#xff1a;本文讲一下Mybatis框架整合人…...

TPM 2.0实例探索2 —— LUKS磁盘加密(3)

接前文&#xff1a;TPM 2.0实例探索2 —— LUKS磁盘加密&#xff08;2&#xff09; 本文大部分内容参考&#xff1a; Code Sample: Protecting secret data and keys using Intel Platform... 二、LUKS磁盘加密实例 3. 将密码存储于TPM的LUKS 由于自动挂载需要在运行时提供一…...

嵌入式Debian主机可接HDMI显示

1、ARM是何物 ARM是一种体系架构。它使用 32 位处理器核心&#xff0c;采用 RISC&#xff08;Reduced Instruction Set Computer&#xff0c;精简指令集计算机&#xff09;架构&#xff0c;核心的运算效率高&#xff0c;占用空间小&#xff0c;功耗低&#xff0c;应用于便携式…...

驱动程序开发:基于ICM20608六轴传感器 --- 使用Regmap API 的 SPI 读取数据 之 IIO驱动

目录一、IIO 子系统简介二、IIO子系统使用的一些相关的结构体、函数等1、iio_dev 结构体  ①modes&#xff1a;是选择iio驱动设备支持的工作模式&#xff0c;模式分别有如下&#xff1a;  ②dev&#xff1a;其是一个设备结构体。  ②channels&#xff1a;为 IIO 设备通道…...

专利撰写 为什么要申请专利 申请专利对个人有什么利益关系 专利申请实例 如何申请专利 专利申请办理流程

专利撰写 专利是对发明者或创造者所创造的发明或设计提供一定期限的独占权的法律保护。撰写专利需要考虑到多方面的因素&#xff0c;包括发明或设计的技术性、可行性、独创性、保密性等等。以下是一些关于专利撰写的常见问题和注意事项&#xff1a;专利类型&#xff1a;专利包括…...

yolov5/6/7系列模型训练日志结果数据对比分析可视化

早在之前使用yolov3和yolov4这类项目的时候可视化分析大都是自己去做的&#xff0c;到了yolov5的时候&#xff0c;变成了一个工具包了&#xff0c;作者全部集成进去了&#xff0c;这里我们以一个具体的结果为例&#xff0c;如下&#xff1a;整个训练过程产生的指标等数据都会自…...

ppppp2-23

#!/bin/sh USBFILE/etc/ppp/usbdevices LIST/etc/ppp/diallist function ec25_find_ttyname() { DEVNAME$1 FLAG0 USB_FIND_PATH/sys/bus/usb/devices for dir in $(ls $USB_FIND_PATH) do echo $(ls USBFINDPATH/USB_FIND_PATH/USBF​INDP​ATH/dir) | grep ttyUSB > /dev…...

【GeoDjango框架解析——读取矢量数据写入postgis数据库】

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 geodjango框架解析之读取矢量数据shp文件写入postgis数据库 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录…...

注意啦!如何通过广告吸引客户直接下单?

2023年跨境电商越来越突出&#xff0c;据业内相关人士称&#xff0c;在未来几年与跨境电商相关的政策仍会继续倾斜甚至加大力度&#xff0c;因此各行各业都响应政策&#xff0c;在新政策落实之前致力于平台的转型升级&#xff0c;做新时代创新型的高质量发展&#xff0c;其实细…...

ThinkPHP ^6图片操作进阶

图片裁剪、缩略、水印不再是TP框架系统内置的功能&#xff0c;需要安装。 目录 安装 图片处理 1.创建图片对象 2.获取图片属性 3.裁剪图像 4.生成缩略图 6.保存图像 7.水印 安装 使用composer在项目根目录打开命令行执行&#xff1a; composer require topthink/think…...

深入理解JS作用域链与执行上下文

变量提升&#xff1a; 变量提升&#xff08; hoisting &#xff09;。 我可恨的 var 关键字&#xff1a; 你读完下面内容就会明白标题的含义&#xff0c;先来一段超级简单的代码&#xff1a; <script type"text/javascript">var str Hello JavaScript hoi…...

UnityEditor编辑器扩展代码实现Project搜索的实现功能和切换Component等

反射实现切换Gameobjecect-Comp之前介绍过Kinematic Character Controller这个插件这个插件很容易和另外一个插件混淆&#xff0c;两个作者头像比较相像&#xff0c;而且这个插件的作者不太喜欢露脸&#xff08;他现在做Dot-CharacterControl去了&#xff09;&#xff0c;几乎网…...

SKAdNetwork:从0到1

一、什么是SKAdNetwork https://developer.apple.com/documentation/storekit/skadnetwork iOS14.5开始&#xff0c;获取IDFA需要用户确认授权才可&#xff0c;此时SKAdNetwork 正式回归。 SKAdNetwork 是苹果在2018年推出的一个更加保护用户隐私的归因框架&#xff0c;并与…...

Spring+MVC+MYbatis注解开发

Spring常见注解 注解一&#xff1a;Configuration 用在类上面&#xff0c;加上这个注解的类可以成为一个spring的xml配置文件&#xff0c;使用的是java代码的配置 注解二&#xff1a;ComponentScan 用在类上&#xff0c;加上注解可以指定扫描路径 注解三&#xff1a;创建对…...

Redis主从复制过程

将目前服务器加入到端口号为6379的从服务器 一主二仆 当期中一台从服务器宕机之后 从服务器重启之后会变成单独的主服务器&#xff0c;与之前的主从复制没有关系&#xff0c;重新使用slaceof命令才能恢复到之前一样 主服务器宕机后&#xff0c;从服务器不会成为主服务器&…...

Spring boot开启定时任务的三种方式(内含源代码+sql文件)

Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09; 源代码sql文件下载链接地址&#xff1a;https://download.csdn.net/download/weixin_46411355/87486580 目录Spring boot开启定时任务的三种方式&#xff08;内含源代码sql文件&#xff09;源代码…...

Tekton实战案例--S2I

案例环境说明 示例项目&#xff1a; 代码仓库&#xff1a;https://gitee.com/mageedu/spring-boot-helloWorld.git 构建工具maven pipeline各Task git-clone&#xff1a;克隆项目的源代码 build-to-package: 代码测试&#xff0c;构建和打包 generate-build-id&#xff1a;生…...

四、使用类实现功能

使用类实现功能 ts中类的继承 ES6中class类中&#xff0c;属性分为&#xff1a;实例上的属性&#xff0c;原型上的方法&#xff1b;也可以叫做&#xff1a;class的属性&#xff0c;class的方法。 类的继承叫法&#xff1a;父类>子类&#xff0c;基类>派生类&#xff1b…...

Java多线程不安全的例子

目录 1. 可见性不安全例子 2. 原子性不安全例子 3. 有序性不安全例子 1. 可见性不安全例子 可见性&#xff1a;一个线程对共享变量的修改&#xff0c;另外一个线程不能够立刻看到。 如果多线程对共享数据进行访问而不采取同步操作的话&#xff0c;那么操作的结果是不一致…...

vivo X Flip会是高端手机市场的又一折叠屏爆款吗?

据多个平台消息&#xff0c;vivo即将推出小折叠屏手机X Flip。据了解&#xff0c;vivo X Flip将采用轻盈便携的竖向折叠布局&#xff0c;以及非常受女性消费者喜爱的结构设计。那么&#xff0c;vivo X Flip会是vivo折叠屏的又一个爆款吗&#xff1f; 一、vivo X Flip小折叠屏手…...

MySQL中MVCC如何解决不可重复读以及幻读?

了解MVCC之前&#xff0c;我们首先需要了解以下两个概念&#xff1a;一致性非锁定读和锁定读&#xff0c;了解这两个概念之后我们在逐步分析MVCC。 一致性非锁定读和锁定读 一致性非锁定读(快照读) 对于 一致性非锁定读的实现&#xff0c;通常做法是加一个版本号或者时间戳字…...

设计模式第八讲:观察者模式和中介者模式详解

一. 观察者模式 1. 背景 在现实世界中&#xff0c;许多对象并不是独立存在的&#xff0c;其中一个对象的行为发生改变可能会导致一个或者多个其他对象的行为也发生改变。例如&#xff0c;某种商品的物价上涨时会导致部分商家高兴&#xff0c;而消费者伤心&#xff1b;还有&…...

关于 mac 本地配置域名能 ping 通,但是浏览器不能访问的问题(而其他电脑操作可访问)

关于 mac 本地配置域名能 ping 通&#xff0c;但是浏览器不能访问的问题&#xff08;而其他电脑操作可访问&#xff09;1. 配置域名的方式1.1 sudo vim /etc/hosts1.2 浏览器插件 LiveHosts2. 问题描述3. 解决问题方法3.1 尝试方法1—确保代理都关闭3.2 尝试方法2—确保域名能p…...

【代码随想录二刷】Day23-二叉树-C++

代码随想录二刷Day23 今日任务 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 语言&#xff1a;C 669. 修剪二叉搜索树 链接&#xff1a;https://leetcode.cn/problems/trim-a-binary-search-tree/ 递归 class Solution { public:Tree…...

Linux GPIO 开发指南

文章目录Linux GPIO 开发指南1 概述1.1 编写目的1.2 适用范围1.3 相关人员2 模块介绍2.1 模块功能介绍2.2 相关术语介绍2.3 总体框架2.4 state/pinmux/pinconfig2.5 源码结构介绍3 模块配置3.1 kernel menuconfig 配置3.2 device tree 源码结构和路径3.2.1 device tree 对 gpio…...

记一次后端生成Zip文件通过浏览器下载后文件损坏,无法打开,不可预知的末端错误,下载后文件比源文件增大

记一次后端生成Zip文件问题前言问题出现排查一、流没有关好二、写入了空白字节三、没有flush定位环节一、生成二、通过SwaggerUI、PostMan进行下载三、结论解决方法前言 在项目上线前夕&#xff0c;临时添加了个数据导出的接口&#xff0c;需求是导出压缩包&#xff0c;选择了项…...

python中savgol_filter的详细解释

目录savgol_filter简介savgol_filter原理参数window_length对平滑的效果参数polyorder的平滑效果savgol_filter简介 Savitzky-Golay滤波器最初由Savitzky和Golay于1964年提出&#xff0c;是光谱预处理中常用滤波方法&#xff0c;它的核心思想是对一定长度窗口内的数据点进行k阶…...

C语言--指针进阶1

目录回顾字符指针指针数组数组指针&数组名和数组名的区别数组指针的使用指针作为形参练习数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参回顾 指针的内容&#xff0c;我们在初级阶段已经有所涉及了&#xff0c;我们先来复习一下 指针就是个变量&am…...