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

Optional详解和常用API

目录

一、Optional简介

二、构建Optional对象三种方式

2.1 Optional.of(value)

 2.1.1 使用案例

2.2 Optional.ofNullable(value)

2.2.1 使用案例

2.3 Optional.empty()

2.3.1 使用案例

三、Optional常用的api解析和使用案例

3.1 isPresent

 3.1.1 使用案例

 3.2 ifPresent

3.2.1 使用案例 

3.3 orElse

3.3.1 使用案例

3.4 orElseGet

3.4.1 使用案例

3.4.2 orElse和orElseGet的区别

3.5 orElseThrow

3.5.1 使用案例

3.6 map

3.6.1 使用案例

3.7 filter

3.7.1 使用案例

3.8 or

3.8.1 使用案例

3.9 stream

3.9.1 使用案例


一、Optional简介

Optional是java1.8引入的容器对象,它提供了非常丰富的API,主要是用于解决空指针异常的问题。

优点

1、清晰的表明变量值

2、丰富的API,增加了对空指针明确处理逻辑

3、提高了代码的强壮型

缺点

1、代码过于冗长

2、逻辑性不明显,代码易读性降低

3、引入了多一个对象的开销

二、构建Optional对象三种方式

2.1 Optional.of(value)

   /*** 返回一个Optional给定的非null值* @param <T>  值类型* @param value 描述的值,必须是非null* @return 返回Optional对象* @throws 如果value为空,抛出空指针异常*/public static <T> Optional<T> of(T value) {return new Optional<>(value);}

 2.1.1 使用案例

Optional<String> optional = Optional.of("hello optional");
System.out.println(optional.get()); //输出hello optional

2.2 Optional.ofNullable(value)

/*** 返回一个描述给定值的Optional,如果不为null,则返回一个有值的Optional对象* @param <T>  值类型* @param value 描述的值,可能为null* @return 返回Optional对象,如果值为null,就返回一个null的Optional对象*/
public static <T> Optional<T> ofNullable(T value) {return value == null ? empty() : of(value);
}

2.2.1 使用案例

Optional<String> optional11 = Optional.ofNullable("hello optional222");
Optional<String> optional2 = Optional.ofNullable(null);
System.out.println("optional12:"+optional11.get());//输出hello optional222
System.out.println("optional1:"+optional2.get());//抛出.NoSuchElementException异常,不存在任何值

2.3 Optional.empty()

  /*** 返回一个空的Optional实例,此Optional没有值* @param <T> 不存在的类型值* @return 返回一个空的Optional*/public static<T> Optional<T> empty() {@SuppressWarnings("unchecked")Optional<T> t = (Optional<T>) EMPTY;return t;}

2.3.1 使用案例

Optional<String> optional3 = Optional.empty();
System.out.println(optional2.get());//抛出.NoSuchElementException异常,不存在任何值

三、Optional常用的api解析和使用案例

3.1 isPresent

含义:判断Optional对象是否包含非空值 

/*** 如果存在值就返回true,如果不存在就返回false*/
public boolean isPresent() {return value != null;
}

 3.1.1 使用案例

Optional<String> optional = Optional.of("hello optional");
if(optional.isPresent()){System.out.println("当前的option不为空,输出为:"+optional.get()); //输出hello optional
}

 3.2 ifPresent

如果Optional非空值,则执行传入操作

 /*** 如果Optional对象存在值,则执行给定的操作,否则不执行任何操作  */
public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);
}

3.2.1 使用案例 

Optional<String> optional11 = Optional.ofNullable("hello optional222");
String str = "string string";
optional11.ifPresent(o -> System.out.println(str));//输出string string

3.3 orElse

如果Optional有值就将其返回,否则返回orElse方法传入的值

/*** 如果存在值,则返回该值,否则返回other* 参数:可以为任意值,也可以为null*/
public T orElse(T other) {return value != null ? value : other;
}

3.3.1 使用案例

String s = null;
String optionStr = Optional.ofNullable(s).orElse("java");
System.out.println("optionStr:"+optionStr); //optionStr为空所以输出java

3.4 orElseGet

如果Optional有值,则将其返回,如果Optional没有值的时候,返回从该Supplier获得的值

/*** 如果存在值,则返回该值,否则返回由函数提供的结果* 参数:需要返回的函数*/
public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();
}

3.4.1 使用案例

class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public static void main(String[] args) {User user = null;user = Optional.ofNullable(user).orElseGet(()->{User user1 = new User();user1.setName("java");return user1;});System.out.println("user:"+user.getName()); //输出 user:java
}

3.4.2 orElse和orElseGet的区别

orElseorElseGet不同之处在于当ofNullable()传入的参数不为null时,orElse方法仍然创建了other这个对象。与之相反,orElseGet方法不创建对象。在执行密度调佣时,比如web服务或者数据查询,这个差异会对性能产生重大影响。而且我们还可以在orElseGet方法中加一些日志,可以把这种为空的情况给暴露出来,所以orElseorElseGet比起来,orElseGet性能和效率都比orElse要强。

3.5 orElseThrow

如果存在则返回该值,否则为空的话可以抛出自定义异常

/*** 如果存在值,则返回该值,否则抛出由异常函数提供的异常* 参数:exceptionSupplier 产生要抛出异常的提供函数* 参数类型:X-引发的异常* 抛出:如果不存在任何值,抛出NullPointerException,如果不存在任何值并且异常函数提供为null* 注意点:带有空参数列表的对异常构造函数的方法引用可用作提供者*/
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}
}

3.5.1 使用案例

class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}public static void main(String[] args) {User user = new User();user.setName("java");User user1 = Optional.ofNullable(user).orElseThrow(()->{return new RuntimeException(); //因为user有值,所以不会抛出异常});System.out.println("user1:"+user1.getName()); // 输出user1:javauser = null;User user2 = Optional.ofNullable(user).orElseThrow(()->{return new RuntimeException(); //因为user为空,抛出需要返回的异常,这里为运行时异常});}

3.6 map

如果当前为Optional.empty,则依旧返回Optional.empty;否则返回一个新的Optional,该Optional函数包含的是:函数mapper在以value作为输入时的输出值,而且我们可以多次使用mapper操作 

/*** 如果存在值,则返回一个Optional,将给定映射函数应用于该值的结果,否则返回一个空的Optional* 如果映射函数返回null结果,则此方法返回空的Optional*/
public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {Objects.requireNonNull(mapper);if (!isPresent())return empty();else {return Optional.ofNullable(mapper.apply(value));}
}

3.6.1 使用案例

class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public static void main(String[] args) {User user = new User();user.setName("java");Optional<String> optionalUser = Optional.ofNullable(user).map(User::getName);System.out.println(optionalUser.get());// 输出 java
}

3.7 filter

接受一个Predicate来对Optional中包含的值进行过滤,如果包含中的值满足条件,那么还是返回这个Optional,否则就返回Optional.empty。

/*** 如果存在一个值,并且该值与给定的值匹配,则返回秒速该值的Optional,否则返回一个空的Optional*/
public Optional<T> filter(Predicate<? super T> predicate) {Objects.requireNonNull(predicate);if (!isPresent())return this;elsereturn predicate.test(value) ? this : empty();
}

3.7.1 使用案例

public static void main(String[] args) {User user = new User();user.setName("java");Optional<String> optionalUser = Optional.ofNullable(user).filter(o->o.getName().equals("java")).map(User::getName);if(optionalUser.isPresent()){System.out.println(optionalUser.get());// 输出 java}else{System.out.println("Optiaon为空");}
}

3.8 or

or方法是只有在java11已上才有

如果一个Optional包含值,则返回自己,否则返回由参数supplier获得的Optional

/*** 如果存在值时,返回一个Optional描述的值,否则将返回一个Optional产生通过供给的功能* 参数:供应商-产生要返回的Optional的供应功能* 返回值:如果一个值存在,返回一个Optional描述此值的Optional,否则Optional所生产的供应功能* 抛出:NullpointerException如果提供函数的null或产生的null结果*/ 
public Optional<T> or(Supplier<? extends Optional<? extends T>> supplier) {Objects.requireNonNull(supplier);if (isPresent()) {return this;} else {@SuppressWarnings("unchecked")Optional<T> r = (Optional<T>) supplier.get();return Objects.requireNonNull(r);}}

3.8.1 使用案例

public static void main(String[] args) {User user = null;Optional<User> optionalUser = Optional.ofNullable(user).or(() -> {User user1 = new User();user1.setName("java");return Optional.of(user1);});if (optionalUser.isPresent()) {System.out.println(optionalUser.get().getName()); //输出 java} else {System.out.println("为空");}
}

3.9 stream

stream方法是只有在java11已上才有 

将Optional转为一个Stream,如果Optional中包含值,那么就返回这个值的Stream,否则就返回一个空的Stream(Stream.empty())

/*** 如果存在值,则返回仅包含该值的顺序Stream,否则返回一个空的Stream* 返回值:Stream*/
public Stream<T> stream() {if (!isPresent()) {return Stream.empty();} else {return Stream.of(value);}
}

3.9.1 使用案例

public static void main(String[] args) {User user = new User();user.setName("java");Stream<User> userStream = Optional.ofNullable(user).stream().filter(u->u.getName().equals("java"));userStream.forEach(u->{System.out.println(u.getName());});
}

参考文档:java中Optional的使用详细解析_java_脚本之家

相关文章:

Optional详解和常用API

目录 一、Optional简介 二、构建Optional对象三种方式 2.1 Optional.of(value) 2.1.1 使用案例 2.2 Optional.ofNullable(value) 2.2.1 使用案例 2.3 Optional.empty() 2.3.1 使用案例 三、Optional常用的api解析和使用案例 3.1 isPresent 3.1.1 使用案例 3.2 ifPrese…...

Unity 3D 物体的Inspector面板

1、Transform&#xff1a;位置、旋转、大小 2、Mesh Filter&#xff1a;物体的形状 3、Mesh Renderer&#xff1a;物体渲染&#xff08;物体的衣服&#xff09; 4、Collider&#xff1a;碰撞体...

闪烁与常亮的符号状态判断机制(状态机算法)

背景说明 在视觉项目中&#xff0c;经常要判断目标的状态&#xff0c;例如&#xff1a;符号的不同频率闪烁、常亮等。然而常规的视觉算法例如YOLO&#xff0c;仅仅只能获取当前帧是否存在该符号&#xff0c;而无法对于符号状态进行判断&#xff0c;然而重新写一个基于时序的卷积…...

Hyper-V如何将文件复制到虚拟机?教您3个简单的方法!

需要将文件复制到虚拟机&#xff01; “大家好&#xff0c;有谁知道Hyper-V怎么将文件复制到虚拟机吗&#xff1f;我有一些文件&#xff0c;想要从主机中复制进虚拟机中&#xff0c;但是我不知道该怎么操作&#xff0c;有谁可以帮帮我吗&#xff1f;谢谢。” Hyper-V虚拟机可…...

Vue主要使用-03

组件通讯 组件通讯也是我们需要了解的,在我们的实际开发中,我们使用的非常多,比如父组件内的数据传入到子组件,子组件的数据传入到父组件,什么是父组件什么是子组件&#xff1f;父组件内包含着我们的子组件,我们的父组件可以有多个子组件,父组件就是我们使用子组件拼接的。 …...

LoadBalance客户端负载均衡

1. 前言Ribbon Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端 负载均衡的工具。简单的说&#xff0c;Ribbon是Netflix发布的开源项目&#xff0c;主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时&#xff0…...

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描

Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描 Burp Suite Professional, Test, find, and exploit vulnerabilities. 请访问原文链接&#xff1a;Burp Suite Professional 2024.5 (macOS, Linux, Windows) - Web 应用安全、测试和扫描…...

逢3必过报数游戏-第13届蓝桥杯省赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第84讲。 逢3必过报数游戏&…...

解决Qt的multimedia库在clion中依赖库补全的问题

解决Qt的multimedia库在clion中使用报错的问题 在clion中&#xff0c;使用Qt的multimedia库时会报如下错误&#xff1a; defaultServiceProvider::requestService(): no service found for - "org.qt-project.qt.mediaplayer" 我猜测出现这个错误的原因很可能是因为…...

图像处理:Python使用OpenCV进行图像锐化 (非锐化掩模、拉普拉斯滤波器)

文章目录 非锐化掩模 (Unsharp Masking)拉普拉斯滤波器 (Laplacian Filter)效果对比总结 在图像处理中&#xff0c;锐化操作用于增强图像的边缘和细节&#xff0c;使图像看起来更清晰。常见的图像锐化方法包括非锐化掩模&#xff08;Unsharp Masking&#xff09;和拉普拉斯滤波…...

windows用脚本编译qt的项目

mingw的 cd build ::设置jom环境 set PATHC:\Qt\Qt5.15.2\Tools\mingw810_32\bin;%PATH% set PATHC:\Qt\Qt5.15.2\5.15.2\mingw81_32\bin;%PATH% ::设置Qt环境 amd64_x86 或者 amd64 ::CALL "D:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Auxilia…...

mybatis-plus使用拦截器实现sql完整打印

shigen坚持更新文章的博客写手&#xff0c;擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长&#xff0c;分享认知&#xff0c;留住感动。 个人IP&#xff1a;shigen 在使用mybatis-plus&#xff08;mybatis&#xff09;的时候&#xff0c;往往需要…...

GPT-4并非世界模型,LeCun双手赞同!ACL力证LLM无法模拟真实世界

一直以来&#xff0c;支持LLM的观点之一是模型可以集成海量事实知识&#xff0c;作为通往「世界模拟器」的基础。虽然也有不少反对意见&#xff0c;但缺乏实证依据。那么&#xff0c;LLM能否作为世界模拟器&#xff1f; 最近&#xff0c;亚利桑那大学、微软、霍普金斯大学等机构…...

第 6 章: Spring 中的 JDBC

JDBC 的全称是 Java Database Connectivity&#xff0c;是一套面向关系型数据库的规范。虽然数据库各有不同&#xff0c;但这些数据库都提供了基于 JDBC 规范实现的 JDBC 驱动。开发者只需要面向 JDBC 接口编程&#xff0c;就能在很大程度上规避数据库差异带来的问题。Java 应用…...

[C++ STL] vector 详解

标题&#xff1a;[C STL] vector 详解 水墨不写bug 目录 一、背景 二、vector简介 三、vector的接口介绍 &#xff08;1&#xff09;默认成员函数接口 i&#xff0c;构造函数&#xff08;constructor&#xff09; ii&#xff0c;析构函数&#xff08;destructor&#xff0…...

PHP简约轻型聊天室留言源码

无名轻聊是一款phptxt的轻型聊天室。 无名轻聊特点&#xff1a; 自适应电脑/手机 数据使用txt存放&#xff0c;默认显示近50条聊天记录 采用jqueryajax轮询方式&#xff0c;适合小型聊天环境。 访问地址加?zhi进入管理模式&#xff0c;发送 clear 清空聊天记录。 修改在…...

代码随想录算法训练营day23|669.修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

669.修剪二叉搜索树 这道题目需要考虑当前节点是否在[low,high]之间&#xff0c; 因为是平衡二叉树&#xff0c; 所以当当前节点值小于low时&#xff0c;那么其左节点肯定更小&#xff0c;因此删除该节点的方式是给root节点返回其右节点的递归&#xff0c;注意&#xff1a;这里…...

实时通信websocket和sse

microsoft/fetch-event-source是一个JavaScript库&#xff0c;用于处理服务器发送的事件&#xff08;Server-Sent Events&#xff0c;简称SSE&#xff09;。它提供了一个简单易用的API&#xff0c;使得客户端可以与服务器进行实时通信。这个库主要用于浏览器环境 安装依赖npm i…...

(超详细)基于动态顺序表实现简单的通讯录项目

前言&#xff1a; 我们在上一章节用c语言实现了线性表中的的动态顺序表&#xff0c;那么顺序表就只是顺序表吗&#xff1f;当然不是&#xff0c;使用顺序表结构可以实现很多项目&#xff0c;许多项目的数据结构都会用到顺序表&#xff0c;本章节我们就要使用顺序表实现一个简易…...

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…...

基于python深度学习的CNN图像识别鲜花-含数据集+pyqt界面

代码下载&#xff1a; https://download.csdn.net/download/qq_34904125/89383615 本代码是基于python pytorch环境安装的。 下载本代码后&#xff0c;有个requirement.txt文本&#xff0c;里面介绍了如何安装环境&#xff0c;环境需要自行配置。 或可直接参考下面博文进行…...

第九站:Java黑——安全编码的坚固防线(第②篇)

4. 验证和过滤输入数据示例&#xff1a;使用Apache Commons Lang 对输入数据进行验证和过滤是防止多种安全漏洞的关键步骤&#xff0c;包括但不限于SQL注入和命令注入。Apache Commons Lang库提供了一些实用方法来帮助进行字符串操作和验证。以下是一个简单的示例&#xff0c;…...

如何优雅的删除正式环境中的大表

引起 MySQL 数据库性能抖动的原因有很多,比如大事务、定时批量查询等,而这些原因我们一般都会注意到。但是,有一个引起性能抖动的原因却经常被我们忽视,那就是在生产环境删除无用的大表,即 DROP TABLE。 一、为什么要 DROP TABLE? 生产环境中,为什么要 DROP TABLE?相…...

Vulnhub-DC-1,7

靶机IP:192.168.20.141 kaliIP:192.168.20.128 网络有问题的可以看下搭建Vulnhub靶机网络问题(获取不到IP) 前言 1和7都是Drupal的网站&#xff0c;只写了7&#xff0c;包含1的知识点 信息收集 用nmap扫描端口及版本号 进入主页查看作者给的提示&#xff0c;不是暴力破解的…...

使用MySQL全文索引实现高效搜索功能

MySQL全文索引是MySQL提供的一种高效的搜索功能&#xff0c;可以快速地搜索文本内容。全文索引可以用于搜索大量文本数据&#xff0c;通常应用在文章、博客、论坛等需要搜索的场景中。 什么是MySQL全文索引 MySQL全文索引是一种用于快速搜索文本内容的索引技术。它可以在存储和…...

数据结构学习笔记-图

1.图的存储 &#xff08;1&#xff09;邻接矩阵法 #define MaxVertexNum 100 //顶点数目的最大值 typedef struct{char Vex[MaxVertexNum]; //顶点表int Edge[MaxVertexNum][MaxVertexNum]; //邻接矩阵表&#xff0c;边表int vexnum,arcnum; //图的当前顶点数和边…...

【归并排序】| 详解归并排序核心代码之合并两个有序数组 力扣88

&#x1f397;️ 主页&#xff1a;小夜时雨 &#x1f397;️专栏&#xff1a;动态规划 &#x1f397;️如何活着&#xff0c;是我找寻的方向 目录 1. 题目解析2. 代码 1. 题目解析 题目链接: https://leetcode.cn/problems/merge-sorted-array/description/ 本道题是归并排序的…...

51单片机STC89C52RC——2.3 两个独立按键模拟控制LED流水灯方向

目的 按下K1键LED流水向左移动 按下K2键LED流水向右移动 一&#xff0c;STC单片机模块 二&#xff0c;独立按键 2.1 独立按键位置 2.2 独立按键电路图 这里要注意一个设计的bug P3_1 引脚对应是K1 P3_0 引脚对应是K2 要实现按一下点亮、再按一下熄灭&#xff0c;我们就需…...

Neo4j连接

终端输入&#xff1a; neo4j console 浏览器访问&#xff1a;http://localhost:7474/ 输入用户名和密码&#xff1a;neo4j&#xff0c; 梦想密码&#xff08;首次neo4j&#xff09; 代码连接用新的服务器地址&#xff1a; g Graph(neo4j://localhost:7687, auth(neo4j, ))…...

List 列表

文章目录 一、什么是 List 列表1.1 创建 List 列表的方式1.2 列表的新增函数方法1.3 列表的删除函数方法1.4 修改列表数据的方法1.5 列表的查询函数方法1.6 列表的排序和反序1.7 列表的复制 一、什么是 List 列表 List 列表&#xff1a;该数据类型定义的变量可以理解为是一个数…...

做网站的英文编辑/宁波seo关键词优化教程

文章参考 英文强制换行css 使用css强制英文单词断行代码css强制换行 案例一&#xff1a;div 控件内容全部英文没有间断 在工作中&#xff0c;给表单的某个字段添加描述信息&#xff0c;于是&#xff0c;测试就输入了’dddddd…(500个)’&#xff0c;查看详情的时候&#xff…...

长沙高端网站建设/公司网站seo外包

最近在尝试leetcode&#xff0c;今天做了一道简单题目&#xff0c;正好开通了博客&#xff0c;分享下自己.net 代码&#xff1a; 1 public int Reverse(int x)2 {3 var intQuery new Queue<int>();4 long temp 0;5 6 whil…...

网站建设维护php/查收录网站

目前/ boot partition /文件夹没有足够的空间,无法执行软件更新.问题&#xff1a;我应该如何正确释放该目录中的一些空间&#xff1f;这是列表&#xff1a;rootmindaugas-ubuntu-14:/boot# ls -latotal 156607drwxr-xr-x 4 root root 3072 Kov 12 09:37 .drwxr-xr-x 24 root ro…...

flash网站管理系统/品牌网站建设制作

具体参考&#xff1a;http://hadoop.apache.org/docs/r2.2.0/hadoop-yarn/hadoop-yarn-site/HDFSHighAvailabilityWithNFS.html 在Hadoop2.0.0之前&#xff0c;NameNode(NN)在HDFS集群中存在单点故障&#xff08;single point of failure&#xff09;&#xff0c;每一个集群中存…...

做游戏视频网站/找广告商的平台

阿里云监控系统支持用户自定义监控类型&#xff0c;具有极强的监控扩展能力&#xff0c;支持用户自己编写监控插件实现自定义监控类型。编写完后将插件放到Agent安装目录下面的scripts目录下面&#xff0c;如果是linux服务器则是/usr/local/cms/scripts目录下面。 监控插件不管…...

网站流量数据分析/吸引客人的产品宣传句子

查了一些资料也不是太明白两个的区别&#xff0c;但是前者是最安全的用法 打个简单的比方&#xff0c;你一个WEB程序&#xff0c;发布到Tomcat里面运行。首先是执行Tomcat org.apache.catalina.startup.Bootstrap类&#xff0c;这时候的类加载器是ClassLoader.getSystemClassLo…...