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. 基于PMBOK的项目管理知识体系

  2. es6常见特性

    Parameters(参数) in ES6 Template Literals (模板文本)in ES6 Multi-line Strings (多行字符串)in ES6 Destructuring  ...

  3. Windows Socket和Linux Socket编程的区别 ZZ

    socket相关程序从Windows移植到Linux下需要注意的: 1)头文件 Windows下winsock.h/winsock2.h Linux下sys/socket.h 错误处理:errno.h ...

  4. mongodb节点配置指南

    修改复制集节点的优先级 复制集节点的 priority 参数的值决定了选举中该节点的优先级.值越高,优先级越高. 我们可以通过修改复制集配置参数中 members 数组位置的优先级来修改对应机器的优先 ...

  5. CSMA/CD 3

    一.二进制指数类型退避算法 (truncated binary exponential type) 发生碰撞的站在停止发送数据后,要推迟(退避)一个随机时间才能再发送数据. 目的:重传时再次发生碰撞的 ...

  6. windows下的FTP命令

    假设要连接的FTP信息如下: FTP Server: FtpTest User: tester Password: 123123 打开Windows的开始菜单,执行"运行"命令,在 ...

  7. git操作:

    error: Your local changes to the following files would be overwritten by merge: **/**/**.php Please, ...

  8. 35、XpathNavigator Xpath导航器 System.Xml.XPath;

    XPathNavigator类包含移动和选择XML所需元素的所有方法. 一.创建: a.如果是从XPathDocument中创建,则是只读的,只能浏览数据:  b.如果是从XmlDocument中创建 ...

  9. Java日期格式化参数对照表

    Symbol Meaning Presentation Example G era designator Text AD y year Number 2009 M month in year Text ...

  10. Session not active, could not store state 的解决方法

    1.开口加上session_start() http://metah.ch/blog/2014/05/facebook-sdk-4-0-0-for-php-a-working-sample-to-ge ...