Java8 Optional剖析
Optional存在的意义
在java8出现之前,通常在调用一个对象的方法的时候,难免会判断对象是否为Null,只有不为null才敢去调用对象的方法,这是一种安全措施,如果不注重这个null的情况,会常常出现NullPointException。相信java程序员对这个异常并不陌生。而java8出现之后使用到了Optional这个接口,它用一种更优雅的方式来处理这种问题,并且使得程序可读性更高。
of
为非null的值创建一个Optional。
通过Optional的静态方法of来创建Optional实例。注意:传入的参数不能为null。如果传入参数为null,则抛出NullPointerException 。
@Testpublic void testOf() {Optional<String> helloWorld = Optional.of("Hello World");Optional<String> nullOptional = Optional.of(null);}
ofNullable
为指定的值创建一个Optional,如果指定的值为null,则返回一个空的Optional。
ofNullable与of唯一的区别是可以接受null。
@Testpublic void testOfNullable() {Optional<String> nullOptional = Optional.ofNullable(null);}
isPresent
如果值存在返回true,否则返回false。以此可用来判断optional实例所封装的对象是否为null。
@Testpublic void testIsPresent() {Optional<String> hello = Optional.ofNullable("Hello World");System.out.println(hello.isPresent());Optional<String> nullHello = Optional.ofNullable(null);System.out.println(nullHello.isPresent());}
ifPresent
如果Optional实例有值则为其调用consumer,否则不做处理。
这个方法让我们可以以此替代原来的判空语句,在非空的情况下做某些事情,不再显示用到if语句。
@Testpublic void testIfPresent() {Optional<String> hello = Optional.ofNullable("Hello World");hello.ifPresent(value -> System.out.println("present!"));Optional<String> nullHello = Optional.ofNullable(null);nullHello.ifPresent(value -> System.out.println("present too?"));}
orElse
如果有值则将其返回,否则返回指定的其它值。
@Testpublic void testOrElse() {Optional<String> hello = Optional.ofNullable("Hello World");String str1 = hello.orElse("I will not be show");System.out.println(str1);Optional<String> nullHello = Optional.ofNullable(null);String str2 = nullHello.orElse("I am null");System.out.println(str2);}
orElseGet
orElseGet与orElse方法类似,区别在于orElseGet方法接受Supplier接口的实现用来生成默认值。
@Testpublic void testOrElseGet() {Supplier<String> strSupplier = () -> "Default Str";Optional<String> hello = Optional.ofNullable("Hello World");String str1 = hello.orElseGet(strSupplier);System.out.println(str1);Optional<String> nullHello = Optional.ofNullable(null);String str2 = nullHello.orElseGet(strSupplier);System.out.println(str2);}
orElseThrow
如果有值则将其返回,否则抛出supplier接口创建的异常。
@Testpublic void testOrElseThrow() {try {Optional<String> hello = Optional.ofNullable("Hello World");hello.orElseThrow(Exception::new);Optional<String> nullHello = Optional.ofNullable(null);nullHello.orElseThrow(Exception::new);} catch (Exception e) {e.printStackTrace();}}
map
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
@Testpublic void testMap() {Optional<String> hello = Optional.ofNullable("Hello World");Optional<String> nullHello = Optional.ofNullable(null);Optional<Integer> integer = hello.map(value -> 1);Optional<Integer> integer1 = nullHello.map(value -> 1);System.out.println(integer.isPresent());System.out.println(integer1.isPresent());}
flatMap
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。flatMap与map类似,区别在于flatMap中的mapper返回值必须是Optional。
@Testpublic void testFlatMap() {Optional<String> hello = Optional.ofNullable("Hello World");hello.flatMap(value -> Optional.of(value + " boy"));String str1 = hello.orElse("no value");System.out.println(str1);Optional<String> nullHello = Optional.ofNullable(null);nullHello.flatMap(value -> Optional.of(value + " boy"));String str2 = nullHello.orElse("no value");System.out.println(str2);}
filter
filter个方法通过传入限定条件对Optional实例的值进行过滤。如果有值并且满足断言条件返回包含该值的Optional,否则返回空Optional。
@Testpublic void testFilter() {Optional<Integer> integer = Optional.of(4);integer.filter(v -> v > 3).ifPresent(v -> System.out.println(v + " > 3"));System.out.println(integer.orElse(0));;}
Java8 Optional剖析相关推荐
- JAVA8 Optional新特性和使用详解
文章目录 一.Optional简介 二.应用Optional 1.创建Optional对象 2.Optional中map用法 3.Optional其它方法用法 三.Optional实战 1.创建Opt ...
- java8 optional使用_[Java8]如何正确使用Optional
Optional是Java8提供的为了解决null安全问题的一个API.善用Optional可以使我们代码中很多繁琐.丑陋的设计变得十分优雅.这篇文章是建立在你对Optional的用法有一定了解的基础 ...
- 聊一聊Java8 Optional,让你的代码更加优雅
Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...
- Java8 Optional解决NPE问题
比如现在有两个类 User 和 Address public class User {private String name;private String phone;private Address ...
- java8 - Optional容器
Optional容器作用:在开发过程中经常存在if(a == null){} 这种判断,若不进行判断就会出现空指针异常的情况,java8的Optional容器出现,是我们不在需要判断是否为空,提高代码 ...
- Java8 Optional类用法
文章目录 API介绍 第一组 Optional(T value) empty() of(T value) ofNullable(T value) 第二组 orElse(T other),orElseG ...
- Java8 Optional,可以这样用啊
以下文章来源方志朋的博客,回复"666"获面试宝典 很多公众号其实都发过 Optional 的文章, 但大多文章都是介绍了 Optional 的 API 用法,却没有给出怎么正确的 ...
- Java8 Optional 最佳实践
作者 | ES_her0 来源 | https://xie.infoq.cn/article/e3d1f0f4f095397c44812a5be 很多公众号其实都发过 Optional 的文章, 但大 ...
- 新容器!不再担心空指针, Java8 Optional类
Optional<T>类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在.或者仅仅保存null,表示这个值不存在.原来用 null 表示一个值不存 ...
最新文章
- nginx-0.1.0文件分析3:ngx_send.c
- 2021-03-26习题4-7 最大公约数和最小公倍数 (15 分)
- 生态伙伴 | 飞书携手ProcessOn助力企业高效远程办公,共同“战疫”
- 虚拟成像技术_AI帝国将崛起,国内幻真虚拟成像技术第一家
- windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
- MySQL为什么用 B+ 树,不用 B 树?
- php生成静态翻页,PHP高手,我刚刚学PHP,在生成静态分页遇到了点有关问题,就是翻页的有关问题,希望可以給出一个漂亮完整的翻页代码,多谢...
- python之父的名字-Python 常见双下划线关键字的用法
- eclipse中run运行不了_Springboot专辑:运行 Spring Boot 应用的 3 种方式!
- 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)
- java static 变量存在哪_Java中的静态方法和静态变量存储在哪里?
- 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面
- 各版本的STP BPDU
- 用SQL Server(T-SQL)获取连接字符串
- 孙鑫VC学习笔记:第十三讲 (三) WM_FILE_NEW消息响应原理
- Teorex Inpaint v9.0.1 图片去水印软件中文便携单文件免费版
- 海康摄像机通过Ehome协议接入EasyCVR无法成功上线的原因排查及配置注意事项
- linux版围棋软件,LEELA围棋下载
- Laravel5.6 模块化公众号与小程序系统项目实战
- 逻辑思维与写作-第一章,第二章-随笔笔记