Java8新特性之Optional类(附代码案例)
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类(附代码案例)相关推荐
- 【java8新特性】——Optional详解(三)
一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null ...
- 【小家java】java8新特性之---Optional的使用,避免空指针,代替三目运算符
相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...
- Java 8新特性:Optional类
Java 8新特性:Optional类 在上一篇介绍Stream流式数据处理的文章中提到了Optional类,这是Java 8新增的一个类,用以解决程序中常见的NullPointerException ...
- 【Optional类】JDK1.8新特性之Optional类的使用
这篇文章,主要介绍JDK1.8新特性之Optional类的使用. 目录 一.Optional类 1.1.Optional类介绍 1.2.Optional属性和方法 (1)value属性 (2)私有构造 ...
- Java8 新特性 - Instant 时间戳类
1.说明 Instant 类 是Java8 中补充的一个 时间戳类. 相较于 System.currentTimeMillis()获取到[毫秒],Instant 可以更为精确的获取到[纳秒]. Ins ...
- optional 解决空指针_Java8新特性:Optional类的正确使用姿势
空指针异常是我们在实际开发中经常会遇到的问题,为了防止程序因为异常而中断,通常要在代码中添加大量的非空验证,例如一个释放 JDBC 相关资源的代码,如下所示. public static void r ...
- JDK8新特性之Optional类
Optional类 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检 ...
- Java8新特性 - LocalTime 时间类的基本使用
1.说明 LocalTime 是 Java8 中新增的 时间类,主要包含了 小时.分钟.秒.纳秒 四个属性. LocalTime类中提供了丰富的API,帮助我们更加简便的操作时间对象. 2.常用API ...
- 【小家java】java8新特性之---全新的日期、时间API(JSR 310规范),附SpringMVC、Mybatis中使用JSR310的正确姿势
[小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小家java ...
最新文章
- python3.6for循环_使用parser_args值输入for循环(python3.6)
- 如何给localStorage设置一个过期时间?
- mysql中的钱null,mysql 中null总结
- 天翼云从业认证【考前半小时的30句话】
- 【Leetcode】Palindrome Number
- 2019年GitHub上最热门的Java开源项目
- 电子计算机哪几部分组成的,电子计算机由哪几部分构成?
- Sharding-JDBC水平分库(水平数据库分片测试)_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记011
- vim:复制复制字符到vim的命令行窗口的4种方法
- python3怎么安装mysql_Python3.7安装mysqlclient
- 改革开放40年·软件产业
- php mssql 字符串截断,SQLServer 自动截断字符串
- 安卓打开cbr文件_什么是CBR和CBZ文件,为什么将它们用于漫画?
- 东方明珠新媒体股份有限公司副总裁范若晗:娱乐+智能,技术推动发展
- 一文搞懂 Webpack 多入口配置
- 国外成熟的程序交易系统的思路 z
- 并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等 目录 1. “共享内存系统”,消息传递系统”。	1 1.1. 共享模式 多进程 多线程	1 1.2. Actor消息模式 事件驱动	2
- 线控加速踏板安全设计
- 4个步解答如何让用户更好地生产内容
- golang泛型快速入门使用(go 1.18及以后版本)
热门文章
- php本地文件包含 截断,php远程文件包含截断问题
- 三只松鼠商品评论分析
- 【docker ros】docker 开启自启运行容器中的程序
- 日志系统新贵,Loki到底优秀在哪里?
- ios代码中的内存泄露,内存检测工具leaks 检测不出来
- 没有android手机确切内核头文件,绕过模块的版本检查,构建一个内核模块
- linux驱动管道,Xilinx Linux 如何理解V4L2的管道驱动程序
- 交易心得(简要总结)
- 【正点原子Linux连载】第二十章 V4L2摄像头应用编程-摘自【正点原子】I.MX6U嵌入式Linux C应用编程指南V1.1
- 少儿思维能力培养受重视 掌门少儿优质课程产品广获家长青睐