Optional的理解和使用
1、Optional 到底是什么?
Optional 是一个包装类。类中包装的对象可以为 NULL 或非 NULL。简单说就是把 NULL 包了一层,防止直接对 NULL 操作报NPE。
2、Optional 的方法说明:
定义:
- Optional 空实例:Optional 实例中的 value == null。
- 判断 Optional 是否存在:Optional 实例中的 value 是否为 null。
看一下Optional 中的源码,大概可以分为如下几类:
2.1 构造函数:2个
private Optional()
:构建一个空的 Optional 实例。实例中的 value == null
private Optional(T var1)
:构建一个Optional 实例。实例中的 value == var1。var1为NULL会抛NPE.
2.2 获取 Optional 实例方法
public static <T> Optional<T> empty()
:获取一个 Optional 空实例。
public static <T> Optional<T> of(T var0)
:获取一个 Optional 实例。var0为NULL会抛NPE。
public static <T> Optional<T> ofNullable(T var0)
:获取一个 Optional 实例。var0为 NULL 会返回一个 Optional 空实例。
2.2 获取 Optional 实例中的 value:
public T get()
:value 为空抛NoSuchElementException。
public T orElse(T var1)
:value 不为 NULL 则返回 value ;为 NULL 返回 var1。
public T orElseGet(Supplier<? extends T> var1)
:value 不为 NULL 则返回 value ;为 NULL 执行 var1。
public <X extends Throwable> T orElseThrow(Supplier<? extends X> var1) throws X
:value 不为 NULL 则返回 value ;为 NULL 执行 var1。
2.3 判断 Optional 是否存在
public boolean isPresent()
:即返回 Optional 实例中的 value 是否为 NULL。
public void ifPresent(Consumer<? super T> var1)
: value 不为 NULL 则执行 var1。
2.4 判断是否相等
public boolean equals(Object var1)
:感觉不出来和其他 equals 有什么区别。唯一的区别就是如果 optional 实例中的 value 为 NULL 也不会有异常,而是会正常进行比较。
2.5 其他 Lambda 表达式的操作:
下面三个方法,如果当前对象为NULL,则返回自己或者一个 Optional 空实例。不 NULL 则执行后面的 Lambda,得到返回结果的Optional 实例。大概是这样,详细区别见源码吧。
public Optional<T> filter(Predicate<? super T> var1)
:
public <U> Optional<U> map(Function<? super T, ? extends U> var1)
:
public <U> Optional<U> flatMap(Function<? super T, Optional<U>> var1)
:
3、Optional 的使用:
暂时没有实例。后续用到了再补。
可先参考:Java高级(三):Optional的巧用 - 知乎
4、参考:
Optional的理解和使用的更多相关文章
- java8 stream编程
说明:这是基于同事的培训材料做的练习,记录下来,以作日后自己coding分析和改进 1.准备 pom.xml <dependency> <groupId>org.apache. ...
- 是时候优雅的和NullPointException说再见了
是时候优雅的和NullPointException说再见了 ️️️️️️️️️️️️️️️️ 最近在参加原创投稿比赛,本篇文章如果对你有帮助的话,欢迎帮忙点击助力下吧 NullPointExcepti ...
- [翻译]理解Swift中的Optional
原文出处:Understanding Optionals in Swift 苹果新的Swift编程语言带来了一些新的技巧,能使软件开发比以往更方便.更安全.然而,一个很有力的特性Optional,在你 ...
- map和flatmap的区别+理解、学习与使用 Java 中的 Optional
转自:map和flatmap的区别 对于stream, 两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...
- 理解、学习与使用 Java 中的 Optional
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...
- 理解、学习与使用 JAVA 中的 OPTIONAL<转>
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- 理解、学习与使用Java中的Optional
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...
- Optional 理解
目录 Optional 理解 1. 含义 2. Optional 类中方法 3. Optional 对象不应该作为方法参数 Optional 理解 1. 含义 Optional 是一个容器对象,该容器 ...
- 理解、学习与使用 JAVA 中的 Optional【转载】
这是一篇转载的文章.刚学java的时候看了好久这个Optional,但一直是懵的.今天又又遇到了,重新回来再看的时候,发现并没有那么难道那个. 转载的文章再开头处写了一个对于理解Optional很关键 ...
随机推荐
- 15分钟入门Markdown
一.标题一 标题三 标题六 # 一.标题一 ### 标题三 ###### 标题六 二.字体 1.普通字体 字体加粗 斜体 斜体加粗 删除线 1.普通字体 **字体加粗** *斜体* ***斜体加粗** ...
- Python 13--数据库
- Codeforces 1221 F Choose a Square
题面 不知道大佬们怎么想的,反正我看到这种区间包含性质的并且score只和包含的区间与询问区间挂钩的题,马上就想到了扫描线23333 虽然革命方向无比正确,但却因为SB错误交了5次才 A. WA第一发 ...
- LibreOJ #110. 乘法逆元
二次联通门 : LibreOJ #110. 乘法逆元 /* LibreOJ #110. 乘法逆元 求一个数在模意义下的所有逆元 */ #include <cstdio> void read ...
- Python3.5以上Celery4.2.1启动报错:ImportError: cannot import name 'LRUCache' from 'kombu.utils.functional'
服务器:Centos7 Python版本:Python 3.7.0 Celery版本:4.2.1 Python3.5以上,OrderDict不允许在迭代过程中进行修改,导致LRUCache.updat ...
- MySQL数据分析(16)— 数据操作之增删改查
前面我们说学习MySQL要从三个层面,四大逻辑来学,三个层面就是库层面,表层面和数据层面对吧,数据库里放数据表,表里放数据是吧,大家可以回忆PPT中jacky的这图,我们已经学完了库层面和表层面,从本 ...
- java.util.Calendar获取时间区间问题
虽然java8的LocalDate已经出来,但是很多项目以及自己习惯上还是使用Date,这里还是简单介绍一下如何通过java.util.Calendar获取时间区间. 1 通过calendar.get ...
- 【转载】Maven安装配置+ GIt&SVN + Jenkins详细配置 软件项目管理 持续集成实验
原文地址: https://www.cnblogs.com/clownice/p/5395933.html 以下是学习笔记: Jenkins是一款开源持续集成的软件,实现集成的自动化 自动构建工具:M ...
- 消灭WinRAR广告
1. 问题描述 WinRAR每次弹出的广告真的令人厌烦至极,虽然软件公司也得恰饭,免费给你用总得看俩广告吧,但是像我这样经常用WinRAR的人来说广告弹出频率未免也太过分了.一开始还只是用火绒的弹窗拦 ...
- eclipse CDT Error: Program "g++" not found in PATH
右击project explore ->properties- >c/c++ build->environment , 设置 mingw_home 路径