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

告别鼠标流!用STM32CubeIDE快捷键玩转代码导航与重构(实战演示)

告别鼠标流&#xff01;用STM32CubeIDE快捷键玩转代码导航与重构&#xff08;实战演示&#xff09; 在嵌入式开发的世界里&#xff0c;效率就是生命线。当你面对一个庞大的STM32工程&#xff0c;频繁在数千行代码中穿梭时&#xff0c;每一次不必要的鼠标点击都在蚕食宝贵的开发…...

Three.js实战:PLY模型加载与交互式3D场景构建

1. 为什么选择Three.js加载PLY模型&#xff1f; 如果你正在寻找一个简单高效的方式来展示3D模型&#xff0c;Three.js绝对是你的首选。作为一个基于WebGL的JavaScript库&#xff0c;它让3D图形开发变得像搭积木一样简单。而PLY格式作为3D扫描和计算机图形学领域的通用格式&…...

Decision Transformer与行为克隆对比分析:何时选择哪种方法

Decision Transformer与行为克隆对比分析&#xff1a;何时选择哪种方法 【免费下载链接】decision-transformer Official codebase for Decision Transformer: Reinforcement Learning via Sequence Modeling. 项目地址: https://gitcode.com/gh_mirrors/de/decision-transfo…...

obsidian-skills高级搜索技巧:快速找到需要的功能

obsidian-skills高级搜索技巧&#xff1a;快速找到需要的功能 【免费下载链接】obsidian-skills Agent skills for Obsidian. Teach your agent to use Markdown, Bases, JSON Canvas, and use the CLI. 项目地址: https://gitcode.com/GitHub_Trending/ob/obsidian-skills …...

Mac环境OpenClaw深度配置:Qwen3.5-9B-AWQ-4bit多模态任务优化

Mac环境OpenClaw深度配置&#xff1a;Qwen3.5-9B-AWQ-4bit多模态任务优化 1. 为什么需要深度配置&#xff1f; 第一次在Mac上跑通OpenClaw对接Qwen3.5-9B-AWQ-4bit模型时&#xff0c;我天真地以为安装完就能顺畅处理多模态任务。直到尝试分析一批产品截图&#xff0c;系统频繁…...

WSL2多版本Ubuntu共存与切换实战指南

1. 为什么需要多版本Ubuntu共存&#xff1f; 很多开发者可能都遇到过这样的困境&#xff1a;项目A需要Ubuntu 20.04的环境&#xff0c;而项目B又要求使用Ubuntu 24.04的新特性。传统做法是在不同机器或虚拟机中分别部署&#xff0c;但这既浪费资源又增加管理难度。WSL2的出现完…...

交付验收前批量筛一遍配图质量:桌面工具用法记录

如果你经常遇到这种场景&#xff1a;项目交付包里附带大量截图、现场照片&#xff0c;甲方要求「明显糊的、过曝的别混进来」&#xff0c;但文件夹嵌套很深&#xff0c;人工抽查像抽奖。可以试一款只做「打分按档归类」的 Windows 桌面工具&#xff0c;全称【批量图片质量检测筛…...

Lansium-Arduino:面向物联网终端的轻量级MQTT通信库

1. 项目概述 Lansium-Arduino 是一个面向嵌入式物联网终端的轻量级通信库&#xff0c;专为 Arduino 生态&#xff08;含 ESP32、ESP8266、Arduino Uno Ethernet/WiFi 扩展板等平台&#xff09;设计&#xff0c;用于实现设备与 Lansium Server 的可靠双向连接。其核心通信协议…...

AI 输出 Token 优化:文言文极简模式的实践

AI 输出 Token 优化&#xff1a;文言文极简模式的实践在 AI 应用开发中&#xff0c;token 消耗直接影响成本。HagiCode 项目通过 SOUL 系统实现了"文言文极简输出模式"&#xff0c;在不损失信息密度的前提下&#xff0c;将输出 token 降低约 30-50%。本文分享这套方案…...

5个技巧让你高效畅玩Switch游戏:开源Ryujinx模拟器全攻略

5个技巧让你高效畅玩Switch游戏&#xff1a;开源Ryujinx模拟器全攻略 【免费下载链接】Ryujinx 用 C# 编写的实验性 Nintendo Switch 模拟器 项目地址: https://gitcode.com/GitHub_Trending/ry/Ryujinx Ryujinx是一款采用C#语言开发的开源Nintendo Switch模拟器&#x…...