optional说明
1.说明
public final class Optional<T> extends Object
可能包含或不包含非空值的容器对象。 如果一个值存在, isPresent()
将返回true
和get()
将返回值。
提供依赖于存在或不存在包含值的其他方法,例如orElse()
(如果值不存在则返回默认值)和ifPresent()
(如果值存在则执行代码块)。
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。
2.API
3.常用方法及示例
Optional 容器类的常用方法:
Optional.of(T t) : 创建一个 Optional 实例。
Optional.empty() : 创建一个空的 Optional 实例。
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例。
isPresent() : 判断是否包含值。
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty()。
fiatMap(Function mapper);与 map 类似,要求返回值必须是Optional。
示例:
package com.example.demo.optional;import com.example.demo.domain.Student;import java.util.Optional;/*** @Author linaibo* @Date 2023/2/26 14:22* @PackageName:com.example.demo.optional* @ClassName: OptionalDemo1* @Version 1.0*/
public class OptionalDemo1 {public static void main(String[] args) {// of方法: 创建一个 Optional 实例。Optional<Student> student = Optional.of(new Student());if (student.isPresent()) {// 执行结果System.out.println(student.get());} else {System.out.println("不存在");}// empty方法:创建一个空的 Optional 实例。结果为不存在Optional<Object> empty = Optional.empty();if (empty.isPresent()) {empty.get();} else {// 执行结果System.out.println("不存在");}// ofNullable:若 t 不为 null,创建 Optional 实例,否则创建空实例。Optional<Student> student1 = Optional.ofNullable(new Student());if (student1.isPresent()) {// 执行结果System.out.println(student1.get());} else {System.out.println("不存在");}// orElse(T t) : 如果调用对象包含值,返回该值,否则返回t。// 有值的场合Optional<Student> empty1 = Optional.of(new Student());Student student2 = new Student();student2.setStudentId(1);student2.setStudentNo("123");student2.setStudentName("张三");Student student3 = empty1.orElse(student2);System.out.println(student3);// 无值的场合Optional<Student> empty12 = Optional.empty();Student student22 = new Student();student22.setStudentId(1);student22.setStudentNo("123");student22.setStudentName("张三");Student student33 = empty12.orElse(student22);System.out.println(student33);// orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值。Optional<Student> empty2 = Optional.empty();Student studen5 = empty2.orElseGet(() -> {Student student4 = new Student();student4.setStudentId(1);student4.setStudentNo("123");student4.setStudentName("张三");return student4;});System.out.println(studen5);}
}
error示例:
// empty方法:创建一个空的 Optional 实例。结果为不存在Optional<Object> empty = Optional.empty();empty.get();执行结果:
Exception in thread "main" java.util.NoSuchElementException: No value presentat java.util.Optional.get(Optional.java:135)at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:29)表示被请求的元素不存在。
Optional<Object> empty = Optional.of(null);if (empty.isPresent()) {empty.get();} else {// 执行结果System.out.println("不存在");}执行结果:
Exception in thread "main" java.lang.NullPointerExceptionat java.util.Objects.requireNonNull(Objects.java:203)at java.util.Optional.<init>(Optional.java:96)at java.util.Optional.of(Optional.java:108)at com.example.demo.optional.OptionalDemo1.main(OptionalDemo1.java:27)在of方法中直接传递一个null,则会出现空指针异常。
4.总结
方法的返回值可以使用optional进行包装,避免空指针。
一般调用ofNullable()方法,然后使用isPresent()方法判断是否有值,没有值得场合直接抛出异常;有值的场合继续后续处理。当然有时候传入的对象有可能是空对象。使用对象的某个具体的项目时要进行判断看看是否有值。
optional说明相关推荐
- Python type hints 之 Optional,Union
1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...
- Java Optional类源码解析和用法
个人网站:http://xiaocaoshare.com/ 要求:jdk1.8以上 Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get( ...
- Java8 Optional,可以这样用啊
以下文章来源方志朋的博客,回复"666"获面试宝典 很多公众号其实都发过 Optional 的文章, 但大多文章都是介绍了 Optional 的 API 用法,却没有给出怎么正确的 ...
- Optional 是个好东西,你真的会用么?
点击关注公众号,Java干货及时送达 作者:zjhred blog.csdn.net/zjhred/article/details/84976734 引言 在文章的开头,先说下NPE问题,NPE问题 ...
- 还在用if(obj!=null)做非空判断?带你快速上手Optional实战性理解!
点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1.前言 相信不少小伙伴已经被java的NPE(Null ...
- 如何正确的使用Java8中的Optional类来消除代码中的null检查
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:一书生VOID lw900925.github.io/jav ...
- JDK8:使用Optional进行变量判空、集合遍历
防止 NPE,是程序员的基本修养. NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方.NPE常是导致Java应用程序失败的最常见的原因.在日常研发工作 ...
- 深入JDK中的Optional
概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...
- Java8的Optional是不是鸡肋?
又是一个阳光明媚的下午,扯淡群里面又在讨论技术,啧啧. 马哥发言道: 原因是他的一位同事请假了,他接手他的代码8天了,要受不了,来看下他同事 Optional 的使用: Optional<Use ...
- SAP MM 采购申请中的物料组字段改成Optional
SAP MM 采购申请中的物料组字段改成Optional? 众所周知,标准SAP系统里,ME51N创建采购申请界面里,物料组字段是必输字段.对于有物料号的采购申请,物料组信息从物料主数据里带过来,不用 ...
最新文章
- linux proxy服务器
- 2018年薪资最高的15个技术岗
- Ubuntu终止进程的方法(kill、pkill、killall)
- Mac+docker+flask
- 005_Redis的Hash数据类型
- C# SqlBulkCopy 避免插入重复数据(不重复即插入)
- C#总结项目《汽车租聘系统》项目代码实例【全注释版】
- python子类继承父类属性实例_python – 从子类内的父类访问属性
- Java 算法 身份证排序
- C++_sizeof关键字_实型(也叫浮点型)---C++语言工作笔记011
- Java Portlets 介绍
- spring是java ee框架吗,Java EE和Spring框架之间的区别
- PHP Error(不定时更新)
- 全球与中国ARM开发套件市场现状及未来发展趋势
- c语言自学去视频,最适合自学的C语言自学视频
- GPT和MBR有什么区别?
- 1991【19CSPS提高组】树的重心 信奥赛Kirito(本人)
- 用浏览器快速开启Docker的体验之旅
- 台式计算机的计算器,台式计算器,desktop calculator,音标,读音,翻译,英文例句,英语词典...
- 网站白天or黑夜切换在重新加载时闪烁白色背景的解决思路