JAVA8 Optional新特性和使用详解
文章目录
- 一、Optional简介
- 二、应用Optional
- 1、创建Optional对象
- 2、Optional中map用法
- 3、Optional其它方法用法
- 三、Optional实战
- 1、创建Optional实例
- 2、默认值
前言:在介绍Optional之前我们先回顾Stream流中两个方法map和flatMap区别。
- map只是一维 1对1 的映射
- 而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新特性和使用详解相关推荐
- java lambda表达式详解_Java8新特性Lambda表达式详解
课程目标: 通过本课程的学习,详细掌握Java8新特性之Lambda表达式: 适用人群:有Java基础的开发人员: 课程概述:从Java 8出现以来lambda是最重要的特性之一,它可以让我们用简洁流 ...
- H5的新特性及API详解(很惊人)
H5的新特性及API详解(很惊人) 2017-01-20 17:00 4057人阅读 评论(0) 收藏 举报 分类: h5(11) js函数(64) js技巧(15) 版权声明:本文为博主原创 ...
- Java8新特性Stream流详解
陈老老老板 说明:新的专栏,本专栏专门讲Java8新特性,把平时遇到的问题与Java8的写法进行总结,需要注意的地方都标红了,一起加油. 本文是介绍Java8新特性Stream流常用方法超详细教学 说 ...
- 显微镜下的webpack4的新特性:mode详解
webpack4支持的一个新特性就是zero配置,不需要config,也可以打包,这对于懒癌患者很有诱惑力,但是这也意味着我们不清楚零配置发生了写什么,也不知道打包出来的文件是否符合我们的心意,全部都 ...
- jdk8新特性 lambda表达式详解
本文主要讲到的内容有: 一- 前言 二- 背景 三- lambda表达式的语法 四- Lambda程序例子 4-1 Runnable Lambda 4-2 Comparator Lambda 4-3 ...
- C++11中的一些新特性以及代码详解
C++11新特性 auto decltype 追踪返回类型 类内成员初始化 列表初始化 基于范围的for循环 静态断言 noexcept修饰符 强类型枚举 常量表达式 原生字符串字面值 继承控制 fi ...
- C++11新特性——λ(lambda)表达式详解
C++11新特性--λ(lambda)表达式 C++11中引入了λ表达式,它可以用来定义一个内联(inline)的函数,作为一个本地的对象或者一个参数.有了λ表达式,我们可以很方便的使用stl标准库. ...
- springboot 优雅停机_Spring Boot 2.3 新特性优雅停机详解
什么是优雅停机 先来一段简单的代码,如下: @RestControllerpublic class DemoController { @GetMapping("/demo") pu ...
- CEPH J版本新特性RGW Multi-tenancy详解
CEPH官方对RGW Multi-tenancy的介绍如下 RGW Multi-tenancy 多租户特性允许创建使用不同的存储桶和用户,前提是将其分离在不同的租户之下.例如,允许不同租户下的Swif ...
最新文章
- iOS架构-C/C++lame库在Mac下编译通用静态库.a库(13)
- 【PC工具】创客、arduino爱好者必备,最最简单好用硬件电路连线绘图工具Fritzing...
- 32 | 浅谈容器网络
- Spring中的@Cacheable开销
- Trident API 概览
- 信息学奥赛一本通 1145:字符串p型编码 | OpenJudge NOI 1.7 31:字符串p型编码
- leetcode400. 第 N 位数字
- 承接一个外包开发项目后,开发流程以及如何做好。
- birt报表数据只有一条_这个低代码报表开发平台,操作类似Excel,用好了不需要加班...
- OpenCV之模板匹配案例
- 金融数据类——外汇,CFD
- 留一份名单,以供研究:2009中国企业500强全名单
- php实现的简单问卷调查系统
- Android 百度离线地图下载完后调用下载好的离线包
- 笔记本电脑外接显示器出现灰屏
- 暴雪定不负我?(20220123 Week3-3)
- 【算法】两道算法题根据提供字母解决解码方法和城市的天际线天际线问题
- python 了解量化交易
- 【NLP入门教程】五、命名实体识别
- Easymock十分钟入门
热门文章
- 汇编解析(1)-内存寻址之实模型平面模式(real mode flat mode)(1)
- rust(58)-凯撒密码
- 新冠肺炎的可视化和预测分析(附代码)
- 一天快速入门python
- 深度学习笔记 第四门课 卷积神经网络 第二周 深度卷积网络:实例探究
- 开启算法编程之旅的准备工作——如何在Windows 上安装 Anaconda 和 PyCharm
- 一文梳理多任务学习(MMoE/PLE/DUPN/ESSM等)
- 推荐系统炼丹笔记:RecSys2020-SSE-PT解锁序列数据挖掘新姿势
- RTC 融合通信服务架构与场景应用 | 2021稀土开发者大会音视频专场
- 开发者们,「Innovation 2021」网易应用创新开发者大赛正式开赛了!