jdk1.8 -- optional 的使用
一.optional的介绍
Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。
Optional 类的引入很好的解决空指针异常。

本文将从三方面来讲解optional:
1.Optional的构建
2.Optional的获取
3.Optional的复合操作
下面先讲解在没有Optional之前我们是如何对null值进行判断的
class Persion{
private Car car;
public Car getCar() {
return this.car;
}
}
class Car{
private Brand insurance;
public Brand getInsurance() {
return this.insurance;
}
}
class Brand {
private String name;
public String getName() {
return this.name;
}
}
public class BeforeOptional {
public static void main(String[] args) {
getBrandName(new Persion());
getBrandNameDefault(new Persion());
}
private static String getBrandName(Persion persion) {
if(null !=persion.getCar()) {
Car car = persion.getCar();
if(null !=car.getInsurance()) {
Brand insurance = car.getInsurance();
if(null !=insurance.getName()) {
return insurance.getName();
}
}
}
return "";
}
private static String getBrandNameDefault(Persion persion) {
String defaultValue = "UNKNOW";
if(null ==persion)
return defaultValue;
Car car = persion.getCar();
if(null == car)
return defaultValue;
Brand insurance = car.getInsurance();
if(null == insurance)
return defaultValue;
return insurance.getName();
}
}
显然,我们需要通过代码来硬编码实现对象引用变量的判断
二.Optional API的操作
//********************** 1. Optional 的构建**********************
//1.1创建一个空的optional(内部new了一个空的optional),不支持get方法,会报异常NoSuchElementException
Optional<Brand> empty = Optional.<Brand>empty();
empty.get();
//1.2创建一个optional,传入的值不能为null,返回Optional<Object>,为null时会报NullPointerException
Optional<Brand> of = Optional.of(new Brand());
System.out.println(of.get());
//1.3创建一个可空可有的optional,对前2种的总结(如果传null,走empty方法,非null,走of方法)
Optional<Brand> brand = Optional.ofNullable(new Brand());
Optional<Object> ofNullable2 = Optional.ofNullable(null);
//********************** 2. Optional 的获取操作**********************
//2.1 如果当前有值,返回这个值,否则报NoSuchElementException("No value present");
brand.get();
//2.2 如果有值,会传出insurance实例,如果没值,会给出传入的参数;(参数是supplier)
brand.orElseGet(Brand::new);
//2.3 如果有值,会传出insurance实例,如果没值,会给出传入的参数;(参数是Insurance 实例)
brand.orElse(new Brand());
//2.4 如果有值,会传出insurance实例,如果没值,可以抛出异常
brand.orElseThrow(RuntimeException::new);
brand.orElseThrow(()->new RuntimeException("not have reference"));
//********************** 3. Optional 的复合操作**********************
//3.1 返回一个boolean值
brand.isPresent();
//3.2 如果有值,有值时可以进行操作(consumer操作)
brand.ifPresent(System.out::println);
//3.3 filter操作,它会通过predicate操作,对brand 以及表达式进行非空的验证,通过后,方能得到结果
brand.filter(b->b.getName() == null).get();
//3.4 map操作:同filter,不同之处在于map会改变get到的类型
brand.map(b->b.getName()).get();
//3.5 flatMap 得到复合操作后的Optional<flatMap参数得到的值的optional>
Optional<Per> per = Optional.ofNullable(new Per());
Optional<Optional<Car2>> map = per.map(Per::getCar); //这个是对Optional<optional<Car2>进行了再一次的封装
Optional<Car2> flatMap = per.flatMap(Per::getCar); //这个得到的还是原来的Optional<Object>
我们回过头来解决开篇中的方法
class Persion2{
private Optional<Car2> car; //注意这里要加上Optional的改写
public Optional<Car2> getCar() {
return car;
}
}
class Car2{
private Optional<Brand2> Brand2; //注意这里要加上Optional的改写
public Optional<Brand2> getBrand2() {
return Brand2;
}
}
class Brand2{
private String name;
public String getName() {
return this.name;
}
}
public static String getInsuranceName(Persion2 per) {
return Optional.ofNullable(per).flatMap(Persion2::getCar).flatMap(Car2::getBrand2).map(b->b.getName()).orElse("Unknown"); //是不是一行代码就搞定了
}
jdk1.8 -- optional 的使用的更多相关文章
- JDK1.8新特性——Optional类
JDK1.8新特性——Optional类 摘要:本文主要学习了JDK1.8新增加的Optional类. 部分内容来自以下博客: https://www.cnblogs.com/1ning/p/9140 ...
- JDK1.8新特性之Optional
概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需 ...
- Linux配置JDK1.7和Resin4.0
1.安装JDK1.7 (1)下载 官网下载路径:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-18802 ...
- JDK各个版本的新特性jdk1.5-jdk8
JDK各个版本的新特性 对于很多刚接触java语言的初学者来说,要了解一门语言,最好的方式就是要能从基础的版本进行了解,升级的过程,以及升级的新特性,这样才能循序渐进的学好一门语言.今天先为大家介绍一 ...
- JAVA 8 Optional类介绍及其源码
什么是Optional对象 Java 8中所谓的Optional对象,即一个容器对象,该对象可以包含一个null或非null值.如果该值不为null,则调用isPresent()方法将返回true,且 ...
- JAVA JDK1.5-1.9新特性
1.51.自动装箱与拆箱:2.枚举(常用来设计单例模式)3.静态导入4.可变参数5.内省 1.61.Web服务元数据2.脚本语言支持3.JTable的排序和过滤4.更简单,更强大的JAX-WS5.轻量 ...
- jdk各个版本的新特性(jdk1.7,1.8,1.9)
用了这么久的jdk,应该会有很多人和我一样,不知道各个版本的jdk的一些新特性,这里简单总结一下.. jdk1.7新特性: 1.在Switch中可以用String字符串 2.对Java集合(Colle ...
- 【新特性】JDK1.8
一.简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的 ...
- 学习笔记 Optional
今天学习到的一种新的防止空指针的方法下面是我自己写的一个例子:节省空间,bean的get set 省略... /** * 类目 * @author 唐 * @date 2018/5/6 17:45 * ...
随机推荐
- python 序列通用操作
通用序列操作:索引:greeting=hellogreeting[0] 分片:number[1,2,3,4,5,6]number[3:6]number[3:6:1] 序列相加:[1,2,3] + [4 ...
- [Luogu] 被污染的河流
https://www.luogu.org/problemnew/show/P3875 线段树扫描线求矩形面积并 扫描线的线段树有点奇怪,修改的标记不会下传,标记的意义是当前区间被完整地覆盖了多少次, ...
- 泰乐事(Telos)白皮书中文版 <一> 泰乐事项目(未完成)
泰乐事项目 一个可持续发展的去中心化EOSIO网络 EOS系统在设计上为人们带来了令人惊喜的一种实现新经济模式的承诺.然而很不幸,其高度中心化的运营正不断地破坏这种承诺.90%的EOS代币掌握在仅仅1 ...
- Windows 用户和内核模式
上图: APP -> user mode OS-> kernel mode Drivers -> user or kernel mode 正所谓 一阴一阳之谓道,继之者善也,成之者性 ...
- dubbo——高可用性
一.zookeeper宕机 zookeeper注册中心宕机,还可以消费dubbo暴露的服务 健壮性: 监控中心宕掉不影响使用,只是丢失部分采样数据 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询, ...
- codeforces gym #101987K -TV ShowGame(2-SAT)
题目链接: https://codeforces.com/gym/101987 题意: 有长度为$n$的只包含$B,R$的字符串 有m种关系,每个关系说出三个位置的确切字符 这三个位置的字符最多有一个 ...
- Yarn 安装 node-sass 依赖导致 Build Fresh Packages 太慢的问题
解决办法: 1. 在 项目目录下新建 .yarnrc 文件 添加以下代码 registry "https://registry.npm.taobao.org" sass_binar ...
- HTTP_POST请求的数据格式
HTTP_POST请求的数据格式 在HTTP的请求头中,可以使用Content-type来指定不同格式的请求信息. Content-type的类型 常见的媒体格式类型: text/html : ...
- Logback 日志策略配置
[参考文章]:官方文档:Logback configuration [参考文章]:logback的使用和logback.xml详解 [参考文章]:Logback源码赏析-日志按时间滚动(切割) 1. ...
- 文本处理三剑客之awk
简介 awk是一种处理文本文件的语言,是一个强大的文本编辑工具.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分在进行各种分析处理. gawk 用法:gawk [optio ...