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 * ...
随机推荐
- git error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
原因:git 版本过低 解决方法:卸载旧版本,重装新版本
- 041_查找 Linux 系统中的僵尸进程
#!/bin/bash#awk 判断 ps 命令输出的第 8 列为 Z 是僵尸进程,显示该进程的 PID 和进程命令 ps aux |awk '{if($8 == "Z"){pri ...
- CSP-S 模拟测试94题解
T1 yuuustu: 可以对两边取对数,然后就转化为两个double的比较,时间复杂度$O(n)$ 然后我就用神奇0.4骗分水过 #include<bits/stdc++.h> usin ...
- c++ 容器反转
// reverse algorithm example #include <iostream> // std::cout #include <algorithm> // st ...
- MySQL group_concat 介绍
在做数据初始化的时候,由于需要修改满足条件的全部订单的状态,因此,想使用group_concat函数提取满足条件的所有订单id,以方便写回滚脚本.测试数据取自表test1,表结构和相关 insert ...
- kubernetes部署nginx/tomcat
kubernetes集群已经部署好了,需要的话可以参考之前的文章https://www.cnblogs.com/winter1519/p/10015420.html [root@master tomc ...
- Process 'xx' Is Running
最近在试着使用idea,工具快捷键和设置都不太熟,今天遇到进程占用问题,感觉有必要总结一下,避免下次遇到同样问题. 常用快捷键: ctrl+n 搜索 ctrl+Shift+n 全部搜索 Ctrl+Al ...
- CISCO实验记录八:ACL访问控制
1.使用ACL实现免ping #access-list 100 deny icmp 192.168.0.1 0.0.0.0 192.168.1.2 0.0.0.0 #access-list 100 p ...
- zabbix监控项整理Items-key
agent.hostname:hostname,字符串 agent.ping:可用性检查,可用返回1:不可用返回空 agent.version:agent程序的版本,返回字符串 kernel.maxf ...
- mysql服务器变量、缓存及索引
服务器变量 注意:其中有些参数支持运行时修改,会立即生效:有些参数不支持,且只能通过修改配置文件,并重启服务器程序生效:有些参数作用域是全局的,且不可改变:有些可以为每个用户提供单独(会话)的设置. ...