JDK1.8新特性——Optional类
JDK1.8新特性——Optional类
摘要:本文主要学习了JDK1.8新增加的Optional类。
部分内容来自以下博客:
https://www.cnblogs.com/1ning/p/9140800.html
概述
对于Java开发人员来说,NullPointException是很常见的一个异常,为了避免这个异常,通常的做法是进行if条件判断,但如果代码里面充满了大量的null判断会让程序变的不再优雅。
所以而JDK1.8中引入了一个新的Optional类,用来处理可能为null的变量,在减少NullPointException的同时,也提升了代码的美观度。但首先我们需要明确的是,它并不是对null关键字的一种替代,而是对于null判定提供了一种更加优雅的实现,从而避免NullPointException。
获取
empty()方法
含义:用来创建一个空的Optional对象。
代码如下:
Optional<String> name = Optional.empty();
of()方法
含义:用来包装一个不为null的对象,如果对象为null,则抛出NullPointException。
代码如下:
Optional<String> name = Optional.of(str);
ofNullable()方法
含义:用来包装一个可以为null的对象,如果对象为null,则创建一个空的Optional对象。
代码如下:
Optional<String> name = Optional.ofNullable(str);
常用方法
isPresent()方法
含义:用来判断Optional对象是否为空,如果为空则返回true,如果不为空则返回false。
代码如下:
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.isPresent());// true
ifPresent()方法
含义:如果Optional对象不为空则执行方法调用,如果为空则什么也不做。
代码如下:
Optional<String> name = Optional.ofNullable("name");
name.ifPresent(System.out::println);// name
get()方法
含义:如果Optional对象不为空,则返回值,如果为空,则抛出NoSuchElementException。
代码如下:
Optional<String> name = Optional.ofNullable("name");
System.out.println(name.get());// name
orElse()方法
含义:如果Optional对象不为空,则返回值,如果为空,则返回指定的值。
代码如下:
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.orElse("no name"));// no name
orElseGet()方法
含义:如果Optional对象不为空,则返回值,如果为空,则返回由传入的Supplier函数式接口生成的值。
代码如下:
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.orElseGet(() -> "no name"));// no name
orElseThrow()方法
含义:如果Optional对象不为空,则返回值,如果为空,则返回由传入的Supplier函数式接口生成的异常。
代码如下:
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.orElseThrow(() -> new NullPointerException()));// java.lang.NullPointerException
filter()方法
含义:判断Optional的值是否满足filter指定的条件,如果满足则返回原来的Optional对象,如果不满足则创建一个空的Optional对象并返回。
代码如下:
Optional<String> name = Optional.ofNullable("name").filter(e -> e != null);
System.out.println(name);// Optional[name]
map()方法
含义:如果Optional不为空,则执行传入的返回值为任意类型的Function函数式接口并将返回值包装为Optional对象,如果Optional为空,则创建一个空的Optional对象并返回。
代码如下:
Optional<Integer> length = Optional.ofNullable("name").map(String::length);
System.out.println(length);// Optional[4]
flatMap()方法
含义:如果Optional不为空,则执行传入的返回值为Optional类型的Function函数式接口并得到返回的Optional对象,如果Optional为空,则创建一个空的Optional对象并返回。
代码如下:
User user = null;
user = Optional.ofNullable(user).flatMap(Optional::ofNullable).orElse(new User());
System.out.println(user);// test.User@768debd
注意事项
orElse()方法和orElseGet()方法的区别
这两个方法在调用的Optional对象不为空时,返回的都是原对象。当Optional对象为空时,orElse()方法返回指定的值,orElseGet()方法返回的是接口调用的返回值。
此外,如果Optional对象如果不为空,orElse()方法也会执行,orElseGet()方法不会执行。
比如,orElse()方法返回一个新的对象,orElseGet()方法调用接口返回的也是一个新的对象,如果Optional对象不为空,orElse()方法会执行初始化,orElseGet()方法不会执行初始化。
map()方法和flatMap()方法的区别
这两个方法在调用的Optional对象为空时,都会创建一个空对象返回。如果Optional对象不为空,map()方法会将执行接口得到的返回值包装为Optional对象,flatMap()方法会直接返回执行接口得到的Optional类型的返回值。
JDK1.8新特性——Optional类的更多相关文章
- Java8 新特性 Optional 类
Optional 类的简介 Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常. Optional ...
- Java8新特性——Optional类的使用(有效的避免空指针异常)
OPtional类的使用 概述 到目前为止,臭名昭著的空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...
- JDK1.8新特性——Collector接口和Collectors工具类
JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...
- JDK1.8新特性之Stream类初识
JDK1.8新特性之Stream类初识 import java.util.Arrays; import java.util.List; import java.util.Optional; impor ...
- JDK1.8新特性——Stream API
JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...
- JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用
jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default Lambda表达式 L ...
- JDK1.8新特性之(三)--函数式接口
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
- JDK1.8新特性之(一)--Lambda表达式
近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...
- JDK1.8新特性之(二)--方法引用
在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...
随机推荐
- Set a One-to-Many Relationship设置一对多关系 (XPO)
In this lesson, you will learn how to set a one-to-many relationship between business objects. The C ...
- 微服务(入门学习五):identityServer4+ocelot+consul实现简单客户端模式
简介 主要是采用identity Server4 和ocelot 加上consul 实现简单的客户端模式 开发准备 环境准备 下载并安装Consul具体请参考前几篇的内容 项目介绍 创建ocelot ...
- Troubleshooting ORA-30036 - Unable To Extend Undo Tablespace (Doc ID 460481.1)
Troubleshooting ORA-30036 - Unable To Extend Undo Tablespace (Doc ID 460481.1) APPLIES TO: Oracle Da ...
- python爬虫中文乱码问题(request方式爬取)
https://blog.csdn.net/guoxinian/article/details/83047746 req = requests.get(url)返回的是类对象 其包括的属性有: r ...
- [视频教程] docker端口映射与目录共享运行PHP
当我们在容器中安装完环境以后,需要在宿主机的端口上访问到容器中的端口,这时候就需要做端口映射.在开发代码的时候,需要频繁的修改代码,因此要把宿主机上的代码目录共享到容器中,这样容器里面就能访问的到代码 ...
- 4-9 Panadas与sklearn结合实例
1.显示百分比的柱状图 In [1]: import pandas as pd import numpy as np import matplotlib.pyplot as plt %matplo ...
- 软件工程基础团队第二次作业(团队项目-需求分析&系统设计)成绩汇总
一.作业题目 团队第二次作业:需求分析&系统设计 二.具体要求 1.作业任务 任务一:组长组织项目组开展需求调研工作(可采取需求调查.问卷.分析已有软件.网上资料等方法).概要设计.详细设计. ...
- 自定义vue的loading插件
在一般的vue项目中,都会用到Loading或者Alert之类的弹窗浮层,而他们是一种比较高频率出现的组件. 一般情况下,我们都会去直接import该组件,然后直接以标签的形式引用进去当前页面组件中, ...
- 19.8.2 luogu 夏令营 游
人生第一次游记....是在学校机房,在luogu网校,在炎炎夏日,在薯条汉堡,在自己的博客里... 十二天快吗? 刚上课那会真的比较兴奋,把每天的计划都排的满满的,希望这十二天慢点,再慢点,我得好好过 ...
- Jupyter notebook and Octave kernel installation
Jupyter notebook 安装 为了更加方便地写 Python 代码,还需要安装 Jupyter notebook. 利用 pip 安装 Jupyter notebook. 为什么要使用 Ju ...