当前位置: 首页 > 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…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题&#xff1a;docker pull 失败 网络不同&#xff0c;需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案

在大数据时代&#xff0c;海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构&#xff0c;在处理大规模数据抓取任务时展现出强大的能力。然而&#xff0c;随着业务规模的不断扩大和数据抓取需求的日益复杂&#xff0c;传统…...