Java 8 新特性:6-Optional类
(原)
先看看上面的说明:
/**
* A container object which may or may not contain a non-null value.
* If a value is present, {@code isPresent()} will return {@code true} and
* {@code get()} will return the value.
*Optional是一个容器对象,它可能包含,也可能不包含一个非空的值,如果这个值存在,isPresent方法将返回true,get方法将会返回它本身
* <p>Additional methods that depend on the presence or absence of a contained
* value are provided, such as {@link #orElse(java.lang.Object) orElse()}
* (return a default value if value not present) and
* {@link #ifPresent(java.util.function.Consumer) ifPresent()} (execute a block
* of code if the value is present).
*Optional提供一些额外的方法,这些方法依赖于它所包含的对象存在与否,例如orElse如果这个包含的对象不存在,将会返回一个默认值和ifPresent方法,如果包含的值存在,则会执行方法块中的内容
* <p>This is a <a href="../lang/doc-files/ValueBased.html">value-based</a>
* class; use of identity-sensitive operations (including reference equality
* ({@code ==}), hash code, or synchronization) on instances of
* {@code Optional} may have unpredictable results and should be avoided.
*这是一个基于值的class类,对于同一性(特性)敏感的操作 (包含引用的相等性如:==),同一性的hashcode或者同步等等、对optional实例可能会产生不可预料的结果,这种结果应该被避免。
* @since 1.8
*/
再看看该类:
public final class Optional<T>
这里一个final类
这是一个基于值的类,上面给出了什么叫基于值,上面给出的链接地址不全,看这里:
http://docs.oracle.com/javase/8/docs/api/java/lang/doc-files/ValueBased.html

这里说的是基于值的类需要满足以下几点:
1、 final类型和不可变的(可能会包含可变对象的引用)
2、 有equals、hashCode、toString方法的实现,它是通过实例的状态计算出来的,而并不会通过其它的对象或变量去计算。
3、 不会使用身份敏感的操作,比如在二个实例之间引用相等性、hashCode或者内在的锁。
4、 判断二个值相等仅仅通过equal方法,而不会通过==去判断。
5、 它不提供构造方法,它通过工厂方法创建它的实例,这不保证返回实例的一致性。
6、 当它们相等时,它是可以自由替换的。如果x和y 调用equal方法返回true,那么可以将x和y任意交换,它的结果不会产生任何变化。
然后再回来看Optional,你能看到它是私有的:
private Optional() {
this.value = null;
}

在它的所有方法中,如果要创建Optional对象,先看看它常用的三个方法。
empty方法回一个空的 Optional对象。
of方法接收一个T参数,T必需为非null值,返回一个Optional对象。
ofNullable方法接收一个T参数,如果T为null,它会调用empty方法,如果不为null则调用of方法。
再看看这二个方法:
isPresent: 如果这个对象的值不为null返回true,否则返回false。
get:如果这个值存在,则返回这个值,如果这个值为null,则抛出异常。
在使用中,这二个方法基本是成对出现的,下面来看一个例子。
String str = "hello";
Optional<String> strValue = Optional.of(str); System.out.println("part1-------------------"); if(str != null){
System.out.println(str);
} System.out.println("part2-------------------"); if(strValue.isPresent()){
System.out.println(strValue.get());
}
这里,part1和part2的代码是等价的,Optional还提供了一种更简单的方法
strValue.ifPresent(s -> System.out.println(s));
ifPresent方法接收一个consumer函数式接口(之前介绍过),将自己的非空的逻辑写进去。Optioanal该方法更加简洁。
orElse方法:接收一个参数,如果存在,返回这个值本身,否则返回返回这个参数。
orElseGet方法:接收一个Supplier,如果存在,返回这个值本身,否则返回Supplier
对象。
map方法:接收一个Function,如果Optioanal为null则抛出异常(所以这里创建Optional对象时建议用Optional.ofNullable()),如果为空值则返回空,如果不为空则返回Function的返回值。
(例如:一个对象Obj,有一个List属性,如果List有值,返回List,否则返回空集合,可以这么写(
Parent parent = new Parent();
Optional<Parent> parentVal = Optional.ofNullable(parent);
System.out.println(parentVal.map(m -> m.getList()).orElse(Collections.emptyList()));
)
Optioanal通常作为方法的返回值来使用,它可以有效的规避返回null的结果,如果一个类需要序列化,当Optional作为参数类型或是成员变量类型是有问题的。因为Optional没有实现序列化,所以Optioanl通常不被建议作为参数或常量使用。
下面给出一些Optional常用的例子:
package com.demo.jdk8; import java.util.Collections;
import java.util.List;
import java.util.Optional; public class Test6 {
public static void main(String[] args) {
String str = "hello";
Optional<String> strValue = Optional.of(str); System.out.println("part1-------------------"); if(str != null){
System.out.println(str);
} System.out.println("part2-------------------"); if(strValue.isPresent()){
System.out.println(strValue.get());
} System.out.println("part3-------------------"); strValue.ifPresent(s -> System.out.println(s)); System.out.println("part4-------------------");
Optional<String> op = Optional.ofNullable(null); System.out.println(op.orElse("hahahaha"));
System.out.println("part5-------------------");
Optional<String> opt = Optional.ofNullable("nihao"); System.out.println(op.orElseGet(() -> "hehehe"));
System.out.println("part6-------------------");
System.out.println(opt.map(m -> m + "123").orElseGet(() -> "world")); System.out.println("part7-------------------"); Parent parent = new Parent();
// List<Object> list = Arrays.asList("张三","李四");
// parent.setList(list); Optional<Parent> parentVal = Optional.ofNullable(parent);
System.out.println(parentVal.map(m -> m.getList()).orElse(Collections.emptyList())); } public void test(Optional optional){ } } class Parent{
private List<Object> list; public List<Object> getList() {
return list;
} public void setList(List<Object> list) {
this.list = list;
}
}
例子请看这里:https://github.com/LeeScofield/java8
Java 8 新特性:6-Optional类的更多相关文章
- JAVA 8 新特性 __ Optional 类
Optional 类是一个可以作为null容器的对象,若值存在调用isPresent()就返回 true,调用get()会返回该对象. Optional是一个容器,可以保存类型T的值,或者仅仅保存nu ...
- Java 15 新特性:隐藏类
什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类.引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们.可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! ...
- 【Java8新特性】Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序
一.序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常.Java8新特性之Optional为此类问题提供了优雅的解决方式. 广大程序员朋友对空值异 ...
- Java 16 新特性:record类
以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...
- java8新特性之Optional类
NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...
- 010-jdk1.8版本新特性二-Optional类,Stream流
1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...
- Java 8新特性之 Optional(八恶人-5)
Oswaldo Mobray 莫博瑞·奥斯瓦尔多 “I‘m Oswaldo Mobray, the hangman in these parts.” “我是莫博瑞·奥斯瓦尔多,这片地区的绞刑官.” 一 ...
- java8新特性六-Optional 类
Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...
- 【Java8新特性】Optional 类
概述 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者 ...
- Java 12 新特性介绍,快来补一补
Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...
随机推荐
- 《HelloGitHub月刊》第 04 期(秋招临近,本期加入了面试相关的项目)
兴趣是最好的老师,而<HelloGitHub> 就是帮你找到兴趣! 因为我比较熟悉python语言,所以月刊中python语言的项目居多,个人能力有限,其他语言涉及甚少,欢迎各路人士加入, ...
- 知其所以然~redis的原子性
原子性 原子性是数据库的事务中的特性.在数据库事务的情景下,原子性指的是:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节. 对于Redis而言,命 ...
- 文本主题模型之潜在语义索引(LSI)
在文本挖掘中,主题模型是比较特殊的一块,它的思想不同于我们常用的机器学习算法,因此这里我们需要专门来总结文本主题模型的算法.本文关注于潜在语义索引算法(LSI)的原理. 1. 文本主题模型的问题特点 ...
- 预测python数据分析师的工资
前两篇博客分别对拉勾中关于 python 数据分析有关的信息进行获取(https://www.cnblogs.com/lyuzt/p/10636501.html)和对获取的数据进行可视化分析(http ...
- eclipse svn插件卸载 重新安装 Subclipse卸载安装 The project was not built since its build path is incomplete This client is too old to work with the working copy at
安装插件的原则就是,要按照规则,插件与本地的svn版本要一致, 这样子本地和eclipse上面就可以无缝使用,不会出现问题 1.卸载eclipse svn插件 2,安装新版的svn插件 2.1,下载 ...
- Centos7-yum部署配置LAMP-之LAMP及php-fpm实现反代动态资源
一.简介 LAMP:linux+apache+mysql(这里用mariadb)+php(perl,python) LAMMP:memcached缓存的 CGI:Common Gateway Inte ...
- JDK源码分析(三)—— LinkedList
参考文档 JDK源码分析(4)之 LinkedList 相关
- [转]Nodejs学习笔记(十五)--- Node.js + Koa2 构建网站简单示例
本文转自:https://www.cnblogs.com/zhongweiv/p/nodejs_koa2_webapp.html 目录 前言 搭建项目及其它准备工作 创建数据库 创建Koa2项目 安装 ...
- 【JVM】问题排查
jetty的调用场景是:为了支持Servlet规范中的注解方式(使得不再需要在web.xml文件中进行Servlet的部署描述,简化开发流程),jetty在启动时会扫描class.lib包,将使用注解 ...
- [LeetCode] 1. Two Sum 两数之和
Part 1. 题目描述 (easy) Given an array of integers, return indices of the two numbers such that they add ...