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类的更多相关文章

  1. Java8 新特性 Optional 类

    Optional 类的简介   Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常.   Optional ...

  2. Java8新特性——Optional类的使用(有效的避免空指针异常)

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

  3. JDK1.8新特性——Collector接口和Collectors工具类

    JDK1.8新特性——Collector接口和Collectors工具类 摘要:本文主要学习了在Java1.8中新增的Collector接口和Collectors工具类,以及使用它们在处理集合时的改进 ...

  4. JDK1.8新特性之Stream类初识

    JDK1.8新特性之Stream类初识 import java.util.Arrays; import java.util.List; import java.util.Optional; impor ...

  5. JDK1.8新特性——Stream API

    JDK1.8新特性——Stream API 摘要:本文主要学习了JDK1.8的新特性中有关Stream API的使用. 部分内容来自以下博客: https://blog.csdn.net/icarus ...

  6. JDK1.8新特性(一) ----Lambda表达式、Stream API、函数式接口、方法引用

    jdk1.8新特性知识点: Lambda表达式 Stream API 函数式接口 方法引用和构造器调用 接口中的默认方法和静态方法 新时间日期API default   Lambda表达式     L ...

  7. JDK1.8新特性之(三)--函数式接口

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

  8. JDK1.8新特性之(一)--Lambda表达式

    近期由于新冠疫情的原因,不能出去游玩,只能在家呆着.于是闲来无事,开始阅读JDK1.8的源代码.在开始之前也查询了以下JDK1.8的新特性,有针对性的开始了这段旅程. 只看不操作,也是不能心领神会的. ...

  9. JDK1.8新特性之(二)--方法引用

    在上一篇文章中我们介绍了JDK1.8的新特性有以下几项. 1.Lambda表达式 2.方法引用 3.函数式接口 4.默认方法 5.Stream 6.Optional类 7.Nashorm javasc ...

随机推荐

  1. 2-2-for循环

    重复执行某些代码 每次执行的时候有个数字在变化 常用格式 <script> for(var i=0; i<3; i++){alert(i); } </script> 1) ...

  2. 控件类——Button、UIControlState状态、title及其属性

    封装: 封装按钮:1.有提示文字 —>UILable 2.并且可以点击 —> UIControl UIButton:是一个按钮(系统已经把UIControl封装好了).  里面可以放文字. ...

  3. 基于TCP连接的socket套接字编程

    基于TCP协议的套接字编程(简单) 服务端 import socket server = socket.socket() server.bind( ('127.0.0.1', 9999) ) serv ...

  4. Lnmp架构部署动态网站环境.2019-7-2-1.1

    一.Mysql简介 Mysql数据库: 1.社区版 2.商业版 3.cluster集群 Mysql安装方式 1.编译安装 2.yum/rpm 3.二进制包,直接解压,无需编译 二.Mysql安装部署 ...

  5. 在Rust中使用C语言的库功能

    主要是了解unsafe{}语法块的作用. #[repr(C)] #[derive(Copy, Clone)] #[derive(Debug)] struct Complex { re: f32, im ...

  6. c# 第40节 密封类、密封方法

    本节内容: 1:密封的存在意义 2:密封方法的实现 1:密封的存在意义 2:密封方法的实现 class2::父类 class Class2 { public virtual void show() { ...

  7. Pwn-pwn-200

    题目地址 ttp://www.whalectf.xin/files/47a658e388a0c505fc07b6ee48a4a2e2/binary_200 32位,开启了NX和Canary保护 存在字 ...

  8. day69_10_14 drf接口框架。

    一.drf框架简介 drf全程是:django-rest framework. 其中涉及的知识点有. 1.接口:什么是接口.restful接口规范 2.CBV生命周期源码 - 基于restful规范下 ...

  9. monkey和monkeyrunner的区别

    简单来说: 1.monkey是在设备或模拟器直接运行adb shell命令生成随机事件来进行测试 2.monkeyrunner是通过API发送特定的命令和事件来控制设备 为了支持黑盒自动化测试的场景, ...

  10. Python学习笔记4 高级特性_20170618

    # 切片(获取list / tuple / 字符串 中指定的元素) l = list(range(10)) l[0:3] l[:3] # 0可以省略 l[:] # 全部 l[3:] # 最后的可以省略 ...