1.说明

public final class Optional<T>
extends Object

可能包含或不包含非空值的容器对象。 如果一个值存在, isPresent()将返回trueget()将返回值。

提供依赖于存在或不存在包含值的其他方法,例如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说明相关推荐

  1. Python type hints 之 Optional,Union

    1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...

  2. Java Optional类源码解析和用法

    个人网站:http://xiaocaoshare.com/ 要求:jdk1.8以上 Optional类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get( ...

  3. Java8 Optional,可以这样用啊

    以下文章来源方志朋的博客,回复"666"获面试宝典 很多公众号其实都发过 Optional 的文章, 但大多文章都是介绍了 Optional 的 API 用法,却没有给出怎么正确的 ...

  4. Optional 是个好东西,你真的会用么?

    点击关注公众号,Java干货及时送达  作者:zjhred blog.csdn.net/zjhred/article/details/84976734 引言 在文章的开头,先说下NPE问题,NPE问题 ...

  5. 还在用if(obj!=null)做非空判断?带你快速上手Optional实战性理解!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 1.前言 相信不少小伙伴已经被java的NPE(Null ...

  6. 如何正确的使用Java8中的Optional类来消除代码中的null检查

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:一书生VOID lw900925.github.io/jav ...

  7. JDK8:使用Optional进行变量判空、集合遍历

    防止 NPE,是程序员的基本修养. NPE(Null Pointer Exception)一直是我们最头疼的问题,也是最容易忽视的地方.NPE常是导致Java应用程序失败的最常见的原因.在日常研发工作 ...

  8. 深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...

  9. Java8的Optional是不是鸡肋?

    又是一个阳光明媚的下午,扯淡群里面又在讨论技术,啧啧. 马哥发言道: 原因是他的一位同事请假了,他接手他的代码8天了,要受不了,来看下他同事 Optional 的使用: Optional<Use ...

  10. SAP MM 采购申请中的物料组字段改成Optional

    SAP MM 采购申请中的物料组字段改成Optional? 众所周知,标准SAP系统里,ME51N创建采购申请界面里,物料组字段是必输字段.对于有物料号的采购申请,物料组信息从物料主数据里带过来,不用 ...

最新文章

  1. linux proxy服务器
  2. 2018年薪资最高的15个技术岗
  3. Ubuntu终止进程的方法(kill、pkill、killall)
  4. Mac+docker+flask
  5. 005_Redis的Hash数据类型
  6. C# SqlBulkCopy 避免插入重复数据(不重复即插入)
  7. C#总结项目《汽车租聘系统》项目代码实例【全注释版】
  8. python子类继承父类属性实例_python – 从子类内的父类访问属性
  9. Java 算法 身份证排序
  10. C++_sizeof关键字_实型(也叫浮点型)---C++语言工作笔记011
  11. Java Portlets 介绍
  12. spring是java ee框架吗,Java EE和Spring框架之间的区别
  13. PHP Error(不定时更新)
  14. 全球与中国ARM开发套件市场现状及未来发展趋势
  15. c语言自学去视频,最适合自学的C语言自学视频
  16. GPT和MBR有什么区别?
  17. 1991【19CSPS提高组】树的重心 信奥赛Kirito(本人)
  18. 用浏览器快速开启Docker的体验之旅
  19. 台式计算机的计算器,台式计算器,desktop calculator,音标,读音,翻译,英文例句,英语词典...
  20. 网站白天or黑夜切换在重新加载时闪烁白色背景的解决思路

热门文章

  1. 父进程创建五个子进程
  2. Netfilter源码分析
  3. Android 屏幕适配之dimens适配
  4. Java使用jacob完成office文档pdf转换
  5. java控制台_JAVA控制台输入输出方法总结
  6. Hbase中RowKey的设计原则和热点问题
  7. 第一次亲密接触读后感(转)
  8. 5、JVM分代模型--新生代 的垃圾回收
  9. 医学成像系列:医学图像特征与品质因素概述
  10. 基金持仓数据分析,满仓干还是等风来?