初识

 A container object which may or may not contain a non-null value.

笔者理解,Optional是一个容器类。将Object放到Optional中,从而可以使用容器的一些特性,比如链式编程(Stream)等。

具体应用起来,可以分为两步:

  1. 放入容器
  2. 使用容器

放入容器

有两个方法可以使用,第一个of,不检查传入value是否为null,可能会报NPE。

第二个ofNullable会检查,如果value为null,就返回一个empty的Optional,不会NPE。

static <T> Optional<T> of(T value)
static <T> Optional<T> ofNullable(T value)

容器方法分析

mapfilter功能差不多,对目标Object做某种操作(Function),或者做某种比较(Pridicate),最后返回符合要求的Optional值,不符合的话就是Empty,不会NPE。

<U> Optional<U>	map(Function<? super T,? extends U> mapper)
// If a value is present, apply the provided mapping function to it, and if the result is non-null, return an Optional describing the result. Otherwise return an empty Optional. Optional<T> filter(Predicate<? super T> predicate)
// If a value is present, and the value matches the given predicate, return an Optional describing the value, otherwise return an empty Optional.

ifPresent也是保证不会NPE的,如果value有值,就做某操作,否则什么都不做。

void ifPresent(Consumer<? super T> consumer)
// If a value is present, invoke the specified consumer with the value, otherwise do nothing.

使用容器

不写那么多if null的代码,而是用Optional的特性保证不会NPE。

示例1

// OLD
if (student != null) {
doSomething(student);
} // NEW
Optional.ofNullable(student).ifPresent(s -> doSomething(s.getName()));

示例2

// OLD
if (student != null) {
if (student.getName() != null) {
doSomething(student.getName().trim());
}
} // NEW
Optional.ofNullable(student).ifPresent(s -> Optional.ofNullable(s.getName()).ifPresent(name -> doSomething(name.trim())));
Optional.ofNullable(student).map(s -> s.getName()).ifPresent(name -> doSomething(name.trim()));
Optional.ofNullable(student).map(Student::getName).ifPresent(name -> doSomething(name.trim()));

总结

Optional和Stream,感觉一是要慢慢去熟悉这种代码风格,二是适合于逻辑不那么复杂的场景。

参考

浅析Java 8新功能Optional的更多相关文章

  1. Java 16 新功能介绍

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 程序猿阿朗博客 已经收录,有很多知识点和系列文章. Ja ...

  2. Java 14 新功能介绍

    不做标题党,认认真真写个文章. 文章已经收录在 Github.com/niumoo/JavaNotes 和未读代码博客,点关注,不迷路. Java 14 早在 2019 年 9 月就已经发布,虽然不是 ...

  3. 超详细 Java 15 新功能介绍

    点赞再看,动力无限.微信搜「程序猿阿朗 」,认认真真写文章. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 15 在 2 ...

  4. Java 17 新功能介绍(LTS)

    点赞再看,动力无限.Hello world : ) 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Jav ...

  5. Java 19 新功能介绍

    点赞再看,动力无限. 微信搜「程序猿阿朗 」. 本文 Github.com/niumoo/JavaNotes 和 未读代码博客 已经收录,有很多知识点和系列文章. Java 19 在2022 年 9 ...

  6. Java 18 新功能介绍

    文章持续更新,可以关注公众号程序猿阿朗或访问未读代码博客. 本文 Github.com/niumoo/JavaNotes 已经收录,欢迎Star. Java 18 在2022 年 3 月 22 日正式 ...

  7. Java 11 新功能来了!

    关键时刻,第一时间送达! 目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出 ...

  8. Java 11新功能抢先了解

    目前 Oracle 已经发布了 Java Development Kit 10,下个版本 JDK 11 也即将发布.本文介绍 Java 11 的新功能. 根据Oracle新出台的每6个月发布一次Jav ...

  9. 浅析Java 8新特性Lambda Expression

    什么是Lambda Expression 对于Lambda Expression,我的理解是,它是一个函数表达式,如下: (int x, int y) -> x - y 符号左边定义了函数的输入 ...

随机推荐

  1. 【汉化】Acunetix Web Vulnerability Scanner 11.x汉化包

    破解补丁::http://www.52pojie.cn/thread-609275-1-1.html 汉化界面截图: 登陆界面 仪表盘 目标   漏洞 扫描 用户配置 汉化详情: 1.对UI界面大部分 ...

  2. 为解决Samba windows 无法访问 尝试过的方法

    1, 通过   vi /etc/sysconfig/selinux 把 SELINUX=enforcing   修改为SELINUX= disable 退出保存,并且重启.(设置了) 2, 把wind ...

  3. mxonline实战-1,创建应用及相应模型

        前言   环境说明:python3.5 + django2.0, 用的pycharm4.04专业版 课程视频地址 https://coding.imooc.com/learn/list/78. ...

  4. set,env和export命令显示shell变量其区别,与环境变量扫盲(一)

    种类: ♦ set     :  用来显示本地变量,显示当前shell的变量,包括当前用户的变量 ♦ env    :  用来显示环境变量,显示当前用户的变量. ♦ export:  用来显示和设置环 ...

  5. 浏览器页面的显隐对js的setInterval()执行所产生的bug

    前段时间,所写的一个”js无间隙滚动效果“,当页面离开后,重新返回时,会出现动画的错乱.我以为是因为我代码逻辑的原因导致的,但是,当在火狐浏览器上进行浏览时却没有动画错乱的问题. 于是乎,在网上查找是 ...

  6. 一款开源免费的办公套件系统:DzzOffice详细部署

    一.系统环境 个人建议centos 7 系统 cat /etc/redhat-release CentOS Linux release (Core) 基本更新 yum update -y 基本优化 关 ...

  7. JS框架设计之对象扩展一种子模块

    对象扩展 说完了,对象的创建(框架的命名空间的创建)以及如何解决多库之间的命名空间冲突问题之后,接下来,就是要扩展我们的对象,来对框架进行扩展,我们需要一种新功能,将新添加的功能整合到我们定义的对象中 ...

  8. wap 往下拉自动加载更多数据

    var stop=true; $(window).scroll(function(){ totalheight = parseFloat($(window).height()) + parseFloa ...

  9. switch表达式、case穿透

    记得第一次学switch的时候那是还是学习c语言的时候,整体的写if-else,switch,现在回想起来已经是很多年前的事了,好了今天让我们再来回顾下简单的switch 语法 switch(n) { ...

  10. JavaScript数据结构-12.散列碰撞(线性探测法)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...