1. 概述
  • Optional< T >类是要给容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null, 表示这个值不存在。原来用null表示一个值不存在,现在Optional可以更好的表达这个概念。并且可以避免空指针异常。
  • Optional类的Javadoc描述如下:这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象
2. 常用方法
  • Optional类提供了很多有用的方法,这样我们就不用显式进行空值检测

  • 创建Optional类对象的方法

    • Optional.of(T t):创建一个Optional实例,t必须非空
    • Optional.empty():创建一个空的Optional实例
    • Optional.ofNullable(T t):t可以为null
  • 判断Optional容器中是否包含对象

    • boolean isPresent():判断是否包含对象
    • void ifPresent(Consumer<? super T> consumer):如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它
  • 获取Optional容器的对象

    • T get():如果调用对象包含值,返回该值,否则抛出异常
    • T orElse(T other):如果有值则将其返回,否则返回指定的other对象
    • T orElseGet(Supplier<? extends other>):如果有值则将其返回,否则返回由Supplier接口实现提供的对象
    • T orElseThrow(Supplier<? extends X> exceptionSupplier):如果有值则将其返回,否则抛出由Supplier接口实现提供的异常
  • 代码示例

package Java8;import org.junit.Test;import java.util.Optional;public class OptionalTest {@Testpublic void test1() {Girl girl = new Girl();Optional<Girl> optionalGirl = Optional.of(girl);}@Testpublic void test2() {Girl girl1 = new Girl();Girl girl2 = new Girl();girl2 = null;Optional<Girl> optionalGirl1 = Optional.ofNullable(girl1);Optional<Girl> optionalGirl2 = Optional.ofNullable(girl2);System.out.println(optionalGirl1);System.out.println(optionalGirl2);}// 未进行非空判断,极有可能空指针异常public String getGirlName(Boy boy) {return boy.getGirl().getName();}// 未使用Optional的getGirlNamepublic String getGirlName1(Boy boy) {if (boy != null) {Girl girl = boy.getGirl();if (girl != null) {return girl.getName();}}return null;}// 使用Optional类public String getGirlName2(Boy boy) {Optional<Boy> boyOptional = Optional.ofNullable(boy);Boy boy1 = boyOptional.orElse(new Boy(new Girl("关悦")));Girl girl = boy1.getGirl();Optional<Girl> girlOptional = Optional.ofNullable(girl);Girl girl1 = girlOptional.orElse(new Girl("杨雨潼"));return girl1.getName();}@Testpublic void test3() {Girl girl = new Girl();girl = null;Optional<Girl> optionalGirl = Optional.ofNullable(girl);// orElse(T t): 如果当前的Optional内部封装的t是非空的,则返回内部的t, 如果内部t为空,则返回orElse()里的参数t1Girl girl1 = optionalGirl.orElse(new Girl("欧阳娜娜"));System.out.println(girl1);}@Testpublic void test4() {Boy boy = new Boy();boy = null;String girlName = getGirlName1(boy);System.out.println(girlName);}@Testpublic void test5() {Boy boy = null;boy = new Boy();String girlName = getGirlName2(boy);System.out.println(girlName);}
}

运行结果

Java8新特性之Optional类(附代码案例)相关推荐

  1. 【java8新特性】——Optional详解(三)

    一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...

  2. 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  3. Java 8新特性:Optional类

    Java 8新特性:Optional类 在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException ...

  4. 【Optional类】JDK1.8新特性之Optional类的使用

    这篇文章,主要介绍JDK1.8新特性之Optional类的使用. 目录 一.Optional类 1.1.Optional类介绍 1.2.Optional属性和方法 (1)value属性 (2)私有构造 ...

  5. Java8 新特性 - Instant 时间戳类

    1.说明 Instant 类 是Java8 中补充的一个 时间戳类. 相较于 System.currentTimeMillis()获取到[毫秒],Instant 可以更为精确的获取到[纳秒]. Ins ...

  6. optional 解决空指针_Java8新特性:Optional类的正确使用姿势

    空指针异常是我们在实际开发中经常会遇到的问题,为了防止程序因为异常而中断,通常要在代码中添加大量的非空验证,例如一个释放 JDBC 相关资源的代码,如下所示. public static void r ...

  7. JDK8新特性之Optional类

    Optional类 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检 ...

  8. Java8新特性 - LocalTime 时间类的基本使用

    1.说明 LocalTime 是 Java8 中新增的 时间类,主要包含了 小时.分钟.秒.纳秒 四个属性. LocalTime类中提供了丰富的API,帮助我们更加简便的操作时间对象. 2.常用API ...

  9. 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势

    [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...

最新文章

  1. python3.6for循环_使用parser_args值输入for循环(python3.6)
  2. 如何给localStorage设置一个过期时间?
  3. mysql中的钱null,mysql 中null总结
  4. 天翼云从业认证【考前半小时的30句话】
  5. 【Leetcode】Palindrome Number
  6. 2019年GitHub上最热门的Java开源项目
  7. 电子计算机哪几部分组成的,电子计算机由哪几部分构成?
  8. Sharding-JDBC水平分库(水平数据库分片测试)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记011
  9. vim:复制复制字符到vim的命令行窗口的4种方法
  10. python3怎么安装mysql_Python3.7安装mysqlclient
  11. 改革开放40年·软件产业
  12. php mssql 字符串截断,SQLServer 自动截断字符串
  13. 安卓打开cbr文件_什么是CBR和CBZ文件,为什么将它们用于漫画?
  14. 东方明珠新媒体股份有限公司副总裁范若晗:娱乐+智能,技术推动发展
  15. 一文搞懂 Webpack 多入口配置
  16. 国外成熟的程序交易系统的思路 z
  17. 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。 1 1.1. 共享模式 多进程 多线程 1 1.2. Actor消息模式 事件驱动 2
  18. 线控加速踏板安全设计
  19. 4个步解答如何让用户更好地生产内容
  20. golang泛型快速入门使用(go 1.18及以后版本)

热门文章

  1. php本地文件包含 截断,php远程文件包含截断问题
  2. 三只松鼠商品评论分析
  3. 【docker ros】docker 开启自启运行容器中的程序
  4. 日志系统新贵,Loki到底优秀在哪里?
  5. ios代码中的内存泄露,内存检测工具leaks 检测不出来
  6. 没有android手机确切内核头文件,绕过模块的版本检查,构建一个内核模块
  7. linux驱动管道,Xilinx Linux 如何理解V4L2的管道驱动程序
  8. 交易心得(简要总结)
  9. 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
  10. 少儿思维能力培养受重视 掌门少儿优质课程产品广获家长青睐