用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)相关推荐

  1. Java8新特性 Optional类

    作为开发人员每天与NullPointerException斗智斗勇.每接收到参数或调用方法获得值得判断一下是否为null.稍不留意,空指针异常就像幽灵一样出现了.这篇文章我们来学习Java8是如何通过 ...

  2. Java8新特性——Optional 类

    文章目录 前言 Optional 类 1.概述 2.API介绍 of ofNullable empty isPresent get ifPresent orElse orElseGet orElseT ...

  3. Java8新特性-Optional

    文章目录 简介 Optional源码分析和使用场景 属性和构造 常用方法 get()方法 isPresent()方法 ifPresent(Consumer<? super T> consu ...

  4. Java8新特性Optional类

    这里写自定义目录标题 Java8 Optional 类 前言 创建 Optional 实例 Optional API常用接口的用法 get()方法 isPresent()方法 isPresent()方 ...

  5. Java8新特性-Optional,狂神说docker笔记百度云

    // 这个是通用的代表NULL值的Optional实例private static final Optional<?> EMPTY = new Optional<>();// ...

  6. Java8新特性Optional、接口中的默认方法与静态方法

    Optional Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念 ...

  7. JAVA8新特性Optional和Stream和Localdate用法

    1.Optional类是Java8为了解决null值判断问题 2.Stream 是Java SE 8类库中新增的关键抽象,Java 8 引入的的Stream主要用于取代部分Collection的操作, ...

  8. Java8新特性——Optional容器类的简单应用

    1.Optional容器类 Optional<T> 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Option ...

  9. java 8 optional 类,Java8新特性-Optional类

    Optional 类(java.util.Optional) 是一个容器类,代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念.并且可以避免空指 ...

  10. Java8 新特性 Optional

    1 package test; 2 3 import java.util.Optional; 4 5 import org.junit.Test; 6 /** 7 * Optional 类是一个可以为 ...

最新文章

  1. mysql 安装卸载_MySQL(一)——安装、卸载以及基本操作
  2. ubuntu14.04、CentOS安装oracle 11g数据库【转载】
  3. 海南电网全力支持新能源发展
  4. elasticsearch-1.3.0 之索引代码粗略梳理
  5. 高性能对象存储MinIO学习
  6. python-环境篇-Anaconda的安装
  7. log4j日志配置方法
  8. IntelliJ IDEA 2018.2设置背景图片及透明度
  9. 智能计算机翻译,爱译网-智能翻译技术-人工智能翻译技术
  10. 提醒:本周欢乐时光和美丽杀变种病毒发作(转)
  11. 微软应用商店安装包_微软苦恼了!微博UWP客户端停止服务:大家都用浏览器去了?...
  12. OC中的分类与类扩展
  13. wifi网络工作原理
  14. [实用教程] 科普贴:SGLTE、SVLTE、CSFB、SRLTE
  15. 360浏览器极速版 v7.5.3.182 官方正式版_HTM5浏览器
  16. Coursera的视频一直加载无法播放问题的完整解决【win10】
  17. 形参和实参的定义和区别
  18. 飞腾CPU服务器系统安装问题
  19. mlops_电影在mlops上
  20. python linux usb摄像头,树莓派用python中的OpenCV输出USB摄像头画面

热门文章

  1. 畅想未来计算机300字,畅想未来作文300字
  2. mysql web聊天_多嘴WEB聊天室基于PHP+MYSQL的中文聊天室
  3. 阿里云云计算 45 阿里云云上安全
  4. 决策树算法中导致递归返回的三种情况
  5. 多元线性回归实现代码
  6. python中popen阻塞怎么办_对Python subprocess.Popen子进程管道阻塞详解
  7. Mapreduce从HBASE抽取数据,生成搜索下拉服务数据,hadoop jar 调用异常问题解决
  8. 计算机图形学完整笔记(四):消隐
  9. 常系数齐次线性微分方程的解法
  10. 378.有序矩阵中第k小的元素(力扣leetcode) 博主可答疑该问题