1. Optional 类是一个可以作为null容器的对象,若值存在调用isPresent()就返回 true,调用get()会返回该对象。

  2. Optional是一个容器,可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,我们可以不用那么拙劣的检测空值。

  3. 使用Option可以很好解决的NPE

类声明

public final class Optional<T> extends Object()

类方法

I、of

返回一个指定非null的Optional值

//调用工厂创建Optional的实例
Optional<String> name = Optional.of("孙舒蕊");
//传入参数为Null,抛出NPE
Optional<String> someNull = Optional.of(null);

II、ofNullable

为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。

ofNullable 与 of 的方法相似,唯一的区别是可以接受参数为null的情况。

//创建一个不包含任何值得Optional
Optional empty = Optional.ofNullable(null);

III、ifPresent

如果Optional实例有值则为其调用 consumer,否则不做处理

如果Optional实例有值,调用ifPresent()可以接受接口或lambda表达式。

name.ifPresent((value) -> {
System.out.println("===="+value.length());
})

VI、orElse

如果有值则将其返回,否则返回指定的其他的值

如果Optional实例有值则将其返回,否则返回orElse的方法参数。

//如果值不为null,orElse方法返回Optional实例的值。
//如果为null,返回传入的消息。
//输出:There is no value present!
System.out.println(empty.orElse("There is no value present!"));
//输出:Sanaulla
System.out.println(name.orElse("There is some value!"));

V、orElseGet

orElseGet与orElse方法类似,区别在于得到的默认值。orElse方法将传入的字符串作为默认值,orElseGet方法可以接受Supplier接口的实现用来生成默认值。

//orElseGet与orElse方法类似,区别在于orElse传入的是默认值,
//orElseGet可以接受一个lambda表达式生成默认值。
//输出:Default Value
System.out.println(empty.orElseGet(() -> "Default Value"));
//输出:Sanaulla
System.out.println(name.orElseGet(() -> "Default Value"));

VI、map

如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。

//map方法执行传入的lambda表达式参数对Optional实例进行修改
//为lambda表达式的返回值创建新的Optional实例作为 map 的方法返回值
Optional<String> upperName= name.map((vlaue) -> value.toUpperCase());
System.out.println(upperName.orElse(" "));

VII、flatMap

如果有值,为其执行mapping函数返回值,否则返回空的Optional。flatMap和map(Function) 方法类似,区别在于flatMap中的mapper返回值必须是Optional。调用结束时,flatMap不会结果用Optional封装。

flatMap方法与map方法类似,区别在于mapping函数的返回值不同 。map方法的mapping函数返回值可以使任何类型T,而flatMap方法的参数map函数,使用flatMap重写的示例如下。

//flatMap 与 map(Function) 非常类似,区别在于传入方法的lambda表达式的返回值类型
//map方法中的lambda表达式的返回值是可以任意类型的,在map函数返回之前会包装成Optional,
//但是flatMap方法中的lambda表达式返回值必须是Optional的实例
upperName=name.flatMap((value) -> Optional.of(value.toUpperCase()));
System.out.println(upperName.orElse("No value found"));
//输出SANAULLA

VIII、filter

//filter方法检查给定的Optional值是否满足某些条件
//如果满足返回一个Optional实例,否则返回空的Optional
Optional<String> name=Optional.of("Christina");
Optional<String> longName=name.filter((value) -> value.length() > 6);
System.out.println(longName.orElse("这个人的名字没有六个字符大1"));
//下面的例子不满足
Optional<String> anotherName=Optional.of("Sana");
Optional<String> shortName=anotherName.filter((value) -> value.length()>6);
System.out.println(shortName.orElse("这个人的名字没有六个字符大2")); ===================输出================================
Christina
这个人的名字没有六个字符大2

JAVA 8 新特性 __ Optional 类的更多相关文章

  1. Java 15 新特性:隐藏类

    什么是隐藏类 隐藏类,是一种不能被其他类直接使用的类.引入隐藏类的主要目的是给框架来使用,使得框架可以在运行时生成类,并通过反射间接使用它们.可能有点抽象,不要紧,下面我们通过一个例子来直观的认识它! ...

  2. 【Java8新特性】Optional类在处理空值判断场景的应用 回避空指针异常 编写健壮的应用程序

    一.序言 空值异常是应用运行时常见的异常,传统方式为了编写健壮的应用,常常使用多层嵌套逻辑判断回避空指针异常.Java8新特性之Optional为此类问题提供了优雅的解决方式. 广大程序员朋友对空值异 ...

  3. Java 16 新特性:record类

    以前我们定义类都是用class关键词,但从Java 16开始,我们将多一个关键词record,它也可以用来定义类.record关键词的引入,主要是为了提供一种更为简洁.紧凑的final类的定义方式. ...

  4. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  5. 010-jdk1.8版本新特性二-Optional类,Stream流

    1.5.Optional类 1.定义 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个 ...

  6. Java 8新特性之 Optional(八恶人-5)

    Oswaldo Mobray 莫博瑞·奥斯瓦尔多 “I‘m Oswaldo Mobray, the hangman in these parts.” “我是莫博瑞·奥斯瓦尔多,这片地区的绞刑官.” 一 ...

  7. java8新特性六-Optional 类

    Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...

  8. 【Java8新特性】Optional 类

    概述 Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者 ...

  9. Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...

随机推荐

  1. 关于 PHPMailer 邮件发送类的使用心得(含多文件上传)

    This is important for send mail PHPMailer 核心文件 class.phpmailer.php class.phpmaileroauth.php class.ph ...

  2. canvas toDataURL() 方法如何生成部分画布内容的图片

    HTMLCanvasElement.toDataURL() 方法返回一个包含图片展示的 data URI .可以使用 type参数其类型,默认为 PNG 格式.图片的分辨率为96dpi. 如果画布的高 ...

  3. angular排序

    说点小案例angular的排序 <!DOCTYPE html> <html ng-app="mk"> <head> <meta chars ...

  4. layui-table渲染不出来

    通过方法渲染 页面代码: <table id="tableList" lay-filter="clublist"></table> js ...

  5. Node服务端极速搭建 -- nvmhome

    > 本文意在让你掌握极速搭建Node服务端(任何Project) ```$ whoaminame: kelvinemail: kelvv@outlook.comhomepage: www.kel ...

  6. django开发博客(1) 入门

    现在正式开始博客开发 1.安装django1.4 如果你使用的是fedoraDVD版,安装时选择了web开发组建,这一步可以省略,因为它自带django环境 django下载地址 https://ww ...

  7. 八、angularjs 中 filter在controller中的使用--避免多次遍历

    filter在html页面的使用司空见惯,比如: filter在controller中使用可以避免多次使用angular.foreach,来进行遍历.例如: 如果使用filter,则会让代码简洁而且明 ...

  8. 使用拦截器拦截html参数

    公司最新需求:根据传递的参数进行业务判断,如果符合条件则继续后面的业务逻辑,否则跳转到指定的错误页面.有些是请求的controller 使用了spring  aop的方式进行验证:但是有些是html页 ...

  9. Protocol Buffer学习笔记

    Protocol Buffer Protobuf基础概念 Protobuf是google开发的数据结构描述语言,能够将结构化数据序列化与反序列化,取代json和xml,常用于服务器通信协议.RPC系统 ...

  10. Apache的主要目录和配置文件详解

    一.Apache 主要配置文件注释Apache的主配置文件:/etc/httpd/conf/httpd.conf默认站点主目录:/var/www/html/Apache服务器的配置信息全部存储在主配置 ...