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剖析相关推荐

  1. JAVA8 Optional新特性和使用详解

    文章目录 一.Optional简介 二.应用Optional 1.创建Optional对象 2.Optional中map用法 3.Optional其它方法用法 三.Optional实战 1.创建Opt ...

  2. java8 optional使用_[Java8]如何正确使用Optional

    Optional是Java8提供的为了解决null安全问题的一个API.善用Optional可以使我们代码中很多繁琐.丑陋的设计变得十分优雅.这篇文章是建立在你对Optional的用法有一定了解的基础 ...

  3. 聊一聊Java8 Optional,让你的代码更加优雅

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  4. Java8 Optional解决NPE问题

    比如现在有两个类 User 和 Address public class User {private String name;private String phone;private Address ...

  5. java8 - Optional容器

    Optional容器作用:在开发过程中经常存在if(a == null){} 这种判断,若不进行判断就会出现空指针异常的情况,java8的Optional容器出现,是我们不在需要判断是否为空,提高代码 ...

  6. Java8 Optional类用法

    文章目录 API介绍 第一组 Optional(T value) empty() of(T value) ofNullable(T value) 第二组 orElse(T other),orElseG ...

  7. Java8 Optional,可以这样用啊

    以下文章来源方志朋的博客,回复"666"获面试宝典 很多公众号其实都发过 Optional 的文章, 但大多文章都是介绍了 Optional 的 API 用法,却没有给出怎么正确的 ...

  8. Java8 Optional 最佳实践

    作者 | ES_her0 来源 | https://xie.infoq.cn/article/e3d1f0f4f095397c44812a5be 很多公众号其实都发过 Optional 的文章, 但大 ...

  9. 新容器!不再担心空指针, Java8 Optional类

    Optional<T>类(java.util.Optional)是一个容器类,它可以保存类型T的值,代表这个值存在.或者仅仅保存null,表示这个值不存在.原来用 null 表示一个值不存 ...

最新文章

  1. nginx-0.1.0文件分析3:ngx_send.c
  2. 2021-03-26习题4-7 最大公约数和最小公倍数 (15 分)
  3. 生态伙伴 | 飞书携手ProcessOn助力企业高效远程办公,共同“战疫”
  4. 虚拟成像技术_AI帝国将崛起,国内幻真虚拟成像技术第一家
  5. windows编译libevent时报告“缺少print_winsock_errors.obj”的解决
  6. MySQL为什么用 B+ 树,不用 B 树?
  7. php生成静态翻页,PHP高手,我刚刚学PHP,在生成静态分页遇到了点有关问题,就是翻页的有关问题,希望可以給出一个漂亮完整的翻页代码,多谢...
  8. python之父的名字-Python 常见双下划线关键字的用法
  9. eclipse中run运行不了_Springboot专辑:运行 Spring Boot 应用的 3 种方式!
  10. 10折交叉验证(10-fold Cross Validation)与留一法(Leave-One-Out)、分层采样(Stratification)
  11. java static 变量存在哪_Java中的静态方法和静态变量存储在哪里?
  12. 【spring boot】5.spring boot 创建web项目并使用jsp作前台页面
  13. 各版本的STP BPDU
  14. 用SQL Server(T-SQL)获取连接字符串
  15. 孙鑫VC学习笔记:第十三讲 (三) WM_FILE_NEW消息响应原理
  16. Teorex Inpaint v9.0.1 图片去水印软件中文便携单文件免费版
  17. 海康摄像机通过Ehome协议接入EasyCVR无法成功上线的原因排查及配置注意事项
  18. linux版围棋软件,LEELA围棋下载
  19. Laravel5.6 模块化公众号与小程序系统项目实战
  20. 逻辑思维与写作-第一章,第二章-随笔笔记

热门文章

  1. 到底应不应该学代码,要不要做人们口中的程序猿。
  2. 4种方法教你如何用动态影像提升网页魅力
  3. WSN(无线传感器网络)中的定位
  4. 数字图像处理(十一)白平衡算法
  5. dbms_metadata.get_ddl( )方法查询建表语句及查询结果解析
  6. GD32F450平台上跑rtthread时,JLINK通过RTT控制块进行VIWER
  7. 大数据-kafka学习(一)——Kafka简介
  8. 【求职】哈喽出行 Java C++方向面经
  9. 1 电磁波与电磁波谱
  10. 财产保险的误区(一)