文章目录

  • 一、Optional简介
  • 二、应用Optional
    • 1、创建Optional对象
    • 2、Optional中map用法
    • 3、Optional其它方法用法
  • 三、Optional实战
    • 1、创建Optional实例
    • 2、默认值

前言:在介绍Optional之前我们先回顾Stream流中两个方法map和flatMap区别。

  1. map只是一维 1对1 的映射
  2. 而flatmap可以将一个2维的集合映射成一个一维,相当于他映射的深度比map深了一层。说的专业点就是,各个流会被合并或者扁平化为一个单一的流。
    例:
public static void mapAndFlatMap() {String[] array = {"HELLO","WORLD"};Stream<String> stream = Arrays.stream(array);List<String> collect = stream.map(s -> s.split("")).flatMap(Arrays::stream).collect(toList());System.out.println(collect);stream = Arrays.stream(array);List<Stream<String>> collect1 = stream.map(s -> s.split("")).map(Arrays::stream).collect(toList());System.out.println(collect1);}

运行结果:

[H, E, L, L, O, W, O, R, L, D]
[java.util.stream.ReferencePipeline$Head@1218025c, java.util.stream.ReferencePipeline$Head@816f27d]

一、Optional简介

作为java程序员,相信大家都遇到过NullPointerException这个异常。这个空指针的由来是,1965年,英国一位计算机科学家Horae提出来的,设计初衷是通过编译器的自动检测机制,确保所有使用和引用方法
都是绝对安全。
在java8汲取了Haskell和Scala的灵感,引入了一个新类Optional。变量存在时Optional只是对类简单封装,变量不存在时会被建模成空的Optional对象,由方法Optional.empty()返回。

二、应用Optional

在使用之前我们先学习如果创建Optional对象。

1、创建Optional对象

  • 创建空的Optional对象
    Optional optCar = Optional.empty();
  • 创建非空Optional对象
    Optional optCar = Optional.of(obj);
  • 可接受null的Optional对象
    Optional optCar = Optional.ofNullable(obj);

2、Optional中map用法

从对象种提取信息java8之前我们需要这些做。
例:

String name = null;
if(obj != null) {name = obj.getName();
}

但是java8之后我可以用一行代码来完成。

Optional<Object> optObj = Optional.ofNullable(obj);
Optional<String> name = optInsurance.map(Object::getName);

3、Optional其它方法用法

Optional类中还有许多其它方法,我们对它进行分类和概括,帮助大家加深印象。

方法 描述
empty 返回一个空的Optional实例
filter 如果只存在并且满足提供的谓词,就返回包含该值的Optional对象,否则返回一个空的Optional对象
flatMap 如果只存在,就对该值执行提供的mapping函数,返回一个Optional类型的值,否则返回一个空的Optional对象
get 如果该值存在,将该值用Optional封装返回,否则抛出一个NoSuchElementException异常
ifPresent 如果值存在,就返回使用该值的方法调用,否则什么也不做
isPresent 如果值存在就返回true,否则返回false
map 如果只存在,就对该值执行提供的mapping函数
of 将执行值用Optional封装返回,如果该值是null,则抛出NullPointerException异常
ofNullable 将执行值用Optional封装返回,如果该值是null,则返回一个空的Optional对象
orElse 如果有值则将其返回,否则返回一个默认值
orElseGet 如果有值则将其返回,否则返回一个指定的Supplier接口生成的值
orElse 如果有值则将其返回,否抛出一个指定的Supplier接口生成的异常

三、Optional实战

1、创建Optional实例

  Optional<Dish> dish1 = Optional.of(dish);Optional<Dish> dish2 = Optional.ofNullable(dish);

2、默认值

  Optional<Dish> dish1 = Optional.of(dish).orElse(new Dish());

综上所知,如果我们想要使用Optional的强大功能,可以封装一个工具类OptionalUtil更好的优化我们的代码。

JAVA8 Optional新特性和使用详解相关推荐

  1. java lambda表达式详解_Java8新特性Lambda表达式详解

    课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...

  2. H5的新特性及API详解(很惊人)

    H5的新特性及API详解(很惊人) 2017-01-20 17:00 4057人阅读 评论(0) 收藏 举报  分类: h5(11)  js函数(64)  js技巧(15)  版权声明:本文为博主原创 ...

  3. Java8新特性Stream流详解

    陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...

  4. 显微镜下的webpack4的新特性:mode详解

    webpack4支持的一个新特性就是zero配置,不需要config,也可以打包,这对于懒癌患者很有诱惑力,但是这也意味着我们不清楚零配置发生了写什么,也不知道打包出来的文件是否符合我们的心意,全部都 ...

  5. jdk8新特性 lambda表达式详解

    本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...

  6. C++11中的一些新特性以及代码详解

    C++11新特性 auto decltype 追踪返回类型 类内成员初始化 列表初始化 基于范围的for循环 静态断言 noexcept修饰符 强类型枚举 常量表达式 原生字符串字面值 继承控制 fi ...

  7. C++11新特性——λ(lambda)表达式详解

    C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...

  8. springboot 优雅停机_Spring Boot 2.3 新特性优雅停机详解

    什么是优雅停机 先来一段简单的代码,如下: @RestControllerpublic class DemoController { @GetMapping("/demo") pu ...

  9. CEPH J版本新特性RGW Multi-tenancy详解

    CEPH官方对RGW Multi-tenancy的介绍如下 RGW Multi-tenancy 多租户特性允许创建使用不同的存储桶和用户,前提是将其分离在不同的租户之下.例如,允许不同租户下的Swif ...

最新文章

  1. iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)
  2. 【PC工具】创客、arduino爱好者必备,最最简单好用硬件电路连线绘图工具Fritzing...
  3. 32 | 浅谈容器网络
  4. Spring中的@Cacheable开销
  5. Trident API 概览
  6. 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码
  7. leetcode400. 第 N 位数字
  8. 承接一个外包开发项目后,开发流程以及如何做好。
  9. birt报表数据只有一条_这个低代码报表开发平台,操作类似Excel,用好了不需要加班...
  10. OpenCV之模板匹配案例
  11. 金融数据类——外汇,CFD
  12. 留一份名单,以供研究:2009中国企业500强全名单
  13. php实现的简单问卷调查系统
  14. Android 百度离线地图下载完后调用下载好的离线包
  15. 笔记本电脑外接显示器出现灰屏
  16. 暴雪定不负我?(20220123 Week3-3)
  17. 【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题
  18. python 了解量化交易
  19. 【NLP入门教程】五、命名实体识别
  20. Easymock十分钟入门

热门文章

  1. 汇编解析(1)-内存寻址之实模型平面模式(real mode flat mode)(1)
  2. rust(58)-凯撒密码
  3. 新冠肺炎的可视化和预测分析(附代码)
  4. 一天快速入门python
  5. 深度学习笔记 第四门课 卷积神经网络 第二周 深度卷积网络:实例探究
  6. 开启算法编程之旅的准备工作——如何在Windows 上安装 Anaconda 和 PyCharm
  7. 一文梳理多任务学习(MMoE/PLE/DUPN/ESSM等)
  8. 推荐系统炼丹笔记:RecSys2020-SSE-PT解锁序列数据挖掘新姿势
  9. RTC 融合通信服务架构与场景应用 | 2021稀土开发者大会音视频专场
  10. 开发者们,「Innovation 2021」网易应用创新开发者大赛正式开赛了!