java8新特性——Optional (1)
用Optional取代null
- 一、为什么要使用Optional?
- 二、Optional API
- 1.创建Optional对象
- 1.1 创建一个空的Optional对象
- 1.2 根据参数创建Optional对象
- 1.3 可接收null的Optional对象
- 2. 解引用Optional对象
- 2.1 get()
- 2.2 orElse(T other)
- 2.3 orElseGet(Supplier<? extends T> other)
- 2.4 orElseThrow(Supplier<? extends X>exceptionSupplier)
- 2.5 ifPresent(Consumer<? super T>)
积羽沉舟,群轻折轴,众口铄金,积毁销骨。
羽毛虽轻,堆积多了也能把船压沉,一大堆不重的东西,堆积多了也能压断车轴,众人异口同声的言论,能够混淆是非,不止一次的诽谤,积累下来也足以致人于毁灭之地。
一、为什么要使用Optional?
Optional是java8为核心类库新设计的一个数据类型,用来替换null值。我们常用null来表示值不存在,但这样做最大的问题在于NullPointerException,一旦引用一个存储null值的变量,程序会立即崩溃。为了消除null给我们带来的困扰,java8引入了Optional。
二、Optional API
1.创建Optional对象
1.1 创建一个空的Optional对象
Optional<Object> empty = Optional.empty();
1.2 根据参数创建Optional对象
Optional<String> optional = Optional.of("optional");
需要注意的是,如果参数值是一个null,下面的代码会立即抛出一个NullPointerException,而不是等到你试图获取值时才返回一个错误。
// 会抛出空指针异常Optional<Object> o = Optional.of(null);
1.3 可接收null的Optional对象
如果参数是null,那么得到的Optional对象就是个空对象。
// 得到一个空的Optional对象
Optional<Object> o = Optional.ofNullable(null);
2. 解引用Optional对象
2.1 get()
public T get() {if (value == null) {throw new NoSuchElementException("No value present");}return value;}
get()是这些方法中最简单但又最不安全的方法。如果变量存在,它直接返回封装的变量值,否则就抛出一个NoSuchElementException异常。除非,你非常确定Optional变量一定包含值。
2.2 orElse(T other)
public T orElse(T other) {return value != null ? value : other;}
这个方法允许你在Optional对象不包含值时提供一个默认值。
2.3 orElseGet(Supplier<? extends T> other)
public T orElseGet(Supplier<? extends T> other) {return value != null ? value : other.get();}
orElseGet(Supplier<? extends T> other)是orElse方法的延迟调用版,Supplier方法只有在Optional对象不含值时才执行调用。如果创建默认值是件耗时费力的工作,你应该考虑采用这种方式(借此提升程序的性能),或者你需要非常确定某个方法仅在Optional为空时才进行调用,也可以考虑该方式(这种情况有严格的限制条件)。
2.4 orElseThrow(Supplier<? extends X>exceptionSupplier)
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X {if (value != null) {return value;} else {throw exceptionSupplier.get();}}
orElseThrow(Supplier<? extends X>exceptionSupplier)和get方法非常类似,它们遭遇Optional对象为空时都会抛出一个异常,但是使用orElseThrow你可以定制希望抛出的异常类型。
2.5 ifPresent(Consumer<? super T>)
public void ifPresent(Consumer<? super T> consumer) {if (value != null)consumer.accept(value);}
ifPresent(Consumer<? super T>)让你能在变量值存在时执行一个作为参数传入的方法,否则就不进行任何操作。
java8新特性——Optional (1)相关推荐
- Java8新特性 Optional类
作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...
- Java8新特性——Optional 类
文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...
- Java8新特性-Optional
文章目录 简介 Optional源码分析和使用场景 属性和构造 常用方法 get()方法 isPresent()方法 ifPresent(Consumer<? super T> consu ...
- Java8新特性Optional类
这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...
- Java8新特性-Optional,狂神说docker笔记百度云
// 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...
- Java8新特性Optional、接口中的默认方法与静态方法
Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...
- JAVA8新特性Optional和Stream和Localdate用法
1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...
- Java8新特性——Optional容器类的简单应用
1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Option ...
- java 8 optional 类,Java8新特性-Optional类
Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...
- Java8 新特性 Optional
1 package test; 2 3 import java.util.Optional; 4 5 import org.junit.Test; 6 /** 7 * Optional 类是一个可以为 ...
最新文章
- mysql 安装卸载_MySQL(一)——安装、卸载以及基本操作
- ubuntu14.04、CentOS安装oracle 11g数据库【转载】
- 海南电网全力支持新能源发展
- elasticsearch-1.3.0 之索引代码粗略梳理
- 高性能对象存储MinIO学习
- python-环境篇-Anaconda的安装
- log4j日志配置方法
- IntelliJ IDEA 2018.2设置背景图片及透明度
- 智能计算机翻译,爱译网-智能翻译技术-人工智能翻译技术
- 提醒:本周欢乐时光和美丽杀变种病毒发作(转)
- 微软应用商店安装包_微软苦恼了!微博UWP客户端停止服务:大家都用浏览器去了?...
- OC中的分类与类扩展
- wifi网络工作原理
- [实用教程] 科普贴:SGLTE、SVLTE、CSFB、SRLTE
- 360浏览器极速版 v7.5.3.182 官方正式版_HTM5浏览器
- Coursera的视频一直加载无法播放问题的完整解决【win10】
- 形参和实参的定义和区别
- 飞腾CPU服务器系统安装问题
- mlops_电影在mlops上
- python linux usb摄像头,树莓派用python中的OpenCV输出USB摄像头画面
热门文章
- 畅想未来计算机300字,畅想未来作文300字
- mysql web聊天_多嘴WEB聊天室基于PHP+MYSQL的中文聊天室
- 阿里云云计算 45 阿里云云上安全
- 决策树算法中导致递归返回的三种情况
- 多元线性回归实现代码
- python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
- Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决
- 计算机图形学完整笔记(四):消隐
- 常系数齐次线性微分方程的解法
- 378.有序矩阵中第k小的元素(力扣leetcode) 博主可答疑该问题