有道云笔记地址 (建议有道云打开,markdown文档,直接拷贝过来有一些问题)

引言

在java的开发中,有一个问题始终会伴随着开发的进程。记得我第一个项目的时候,有一个同事在评论我的代码的时候说到。那个火山君,你这个代码写的太烂了,完全没有考虑到对象可能是空的情况。具体的代码我不太记得,写一段伪代码。看了下面的代码,我感觉只要有开发经验(java开发经验)的小伙伴肯定会大喊一声,卧槽~这啥玩样!但是对于我这个小萌新来说,当时确实在开发的时候没有去想过这么个问题----NPE(Null Point Exception)。诸如此类的问题还有很多,但是NPE的处理不应该混杂在我们的业务之中,java程序设计者也想到了这个问题,为了规避这个问题,就提出来了Optional这个包装类。它的作用是值不存在的时候产生可代替物,而只有在存在的时候才会使用它的值。

1.Optional<T> 类

1.简单介绍

查看javadoc对Optional类(这是一个包装类)的解释,这是一个可能包含一个非空值或者空值的对象。看一下它的类图。Optional对象要么包装了一个T范型的类要么就是没有包装任何对象。

java doc可以暂时略过

在源码中,我看到了它的定义使用了class关键字,但是它的构造方法确是私有的。在下图中,可以清楚看到了编译器告诉我们,【Optional has private access in java.util.Optional】。但是如果通过反射是否可以new出它的示例宁? 

这样是不行的,因为构造方法也是私有的。那更改一下权限。 

还是不行。再试一下

再试一下,成功。其实我这边抛除一个疑问,既然可以通过反射来获取实例,那么私有构造函数的意义是什么?有了这个想法说明思考了。诚然,jdk8中这样的包装类没有进行防止反射,是因为java语言的特性,回归到到这边私有构造方法的意义就是让这个类的构建方法被定义,从而保证类的私有性。我这样的反射写法也没有什么意义。

2.部分方法详解

1.empty()

这是一个静态方法可以通过类型.empty()方法直接建立。它返回的是一个空的实例。

代码解析

这个怎么回事?不是说Optional可以规避空指针异常,怎么又出来了空指针异常。分析一下步骤一:Optional<Integer> optionalInteger = Optional.empty();申请一个空的对象,步骤二:optionalInteger.get()获取optionalInteger中的对象,步骤三:System.out.println打印这个对象。步骤二中获取对象可能是一个空对象,在打印空对象就很容出现空指针异常。那么需要如何来写宁?

2.orElse() / orElseGet() / orElseThrow()

当包装类不存在,执行orElse(执行这个里面的lambda的表达式),orElseGet(执行这个里面的lambda的表达式),orElseThrow()抛除这个异常。

orElseGet()

orElseThrow()

orElse()

写到这里,我不禁有个疑问,似乎orElse()和orElseGet()方法存在着某些交集。打开javadoc,注意:orElse()是return一个值,orElseGet()return the result of that invocation.(注意是返回的调用结果)参数中一个T other,一个是一个Supplier 接口(生产者,返回一个T类型的值)

3.map() 方法

这个一个映射方法,是将optional封装的包装类进行映射

  1. get()获取Optional包装的类的值,注意,get方法不能够防止NPE。

运行结果如下: 

使用flatMap(Stream接口中)来构建Optioanl类

产生将mapper应用于当前Optional值。

(这个示例来自java核心技术券II page13)

比如,存在一个可以生产Optional<T>的方法g(),并且T中有一个可以生产Optional<U++>的方法f(),那么想要得到U对象的实例,必须通过s.g().f()的组合。这样的组合在Java在开发中也会经常遇到,给出一下一段示例代码,对这样的结构来分析++

总结

空指针的解决方案Optional包装类的更多相关文章

  1. Java开发笔记(七十七)使用Optional规避空指针异常

    前面在介绍清单用法的时候,讲到了既能使用for循环遍历清单,也能通过stream流式加工清单.譬如从一个苹果清单中挑选出红苹果清单,采取for循环和流式处理都可以实现.下面是通过for循环挑出红苹果清 ...

  2. java8学习之Optional深入详解

    自上次[http://www.cnblogs.com/webor2006/p/8243874.html]函数式接口的学习告一段落之后,这次来学习一下Optional,它并非是函数式接口的概念,点击查看 ...

  3. Java 8 Stream 教程

    Java 8 Stream Tutorial 本文采用实例驱动的方式,对JAVA8的stream API进行一个深入的介绍.虽然JAVA8中的stream API与JAVA I/O中的InputStr ...

  4. SSH综合练习-仓库管理系统-第二天

    SSH综合练习-仓库管理系统-第二天 今天的主要内容: 货物入库 页面信息自动补全回显功能:(学习目标:练习Ajax交互) 根据货物简记码来自动查询回显已有货物(Ajax回显) 根据货物名来自动查询补 ...

  5. 这可能是史上最好的 Java8 新特性 Stream 流教程

    本文翻译自 https://winterbe.com/posts/2014/07/31/java8-stream-tutorial-examples/ 作者: @Winterbe 欢迎关注个人微信公众 ...

  6. Java JPA小记

    什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...

  7. 【转】Java8 Stream 流详解

      当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是 ...

  8. 是时候优雅的和NullPointException说再见了

    是时候优雅的和NullPointException说再见了 ️️️️️️️️️️️️️️️️ 最近在参加原创投稿比赛,本篇文章如果对你有帮助的话,欢迎帮忙点击助力下吧 NullPointExcepti ...

  9. 还在重复写空指针检查代码?考虑使用 Optional 吧!

    一.前言 如果要给 Java 所有异常弄个榜单,我会选择将 NullPointerException 放在榜首.这个异常潜伏在代码中,就像个遥控炸弹,不知道什么时候这个按钮会被突然按下(传入 null ...

随机推荐

  1. linux 查看运行java所在目录

    通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息 需要查看pos_service.jar的绝对路径(在哪里目录下)  使用:ll /proc/PID Linux在启动一个进 ...

  2. Http协议有什么特点,能说说这些特点体现在哪些方面吗?

    Http协议有什么特点,能说说这些特点体现在哪些方面吗? Http协议是我们最常用的接口,那它有什么特点呢? 无连接 无状态 还有呢? 灵活,简单快速 还有它的这些特点体现在哪些方面?你也要能说一说. ...

  3. 狂神说Elasticsearch7.X学习笔记整理

    Elasticsearch概述 一.什么是Elasticsearch? Lucene简介 Lucene是一套用于全文检索和搜寻的开源程序库,由Apache软件基金会支持和提供 Lucene提供了一个简 ...

  4. Unity动态构建mesh绘制多边形算法流程分析和实践

    前言 先说一下,写这篇博文的动机,原文的博主代码写的十分潇洒,以至于代码说明和注释都没有,最近恰逢看到,所以以此博文来分析其中的算法和流程 参考博文:https://blog.csdn.net/lin ...

  5. GitBash管理代码

    一.Git是什么? Git是目前世界上最先进的分布式版本控制系统. 1.Git和SVN的区别 SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中 ...

  6. web.xml常用配置详解

    web.xml常用配置详解 context-param 指定 ServletContext(上下文) 配置文件路径,基本配置一般是Spring配置文件,或者是spring-security的配置文件. ...

  7. 03.21 ICPC训练联盟周赛:UCF Local Programming Contest 2018正式赛

    B Breaking Branches 题意:两个人比赛折枝,谁剩下最后1,无法折出整数即为输 思路:树枝长n,若是奇数,则Bob胜出,若是偶数,则Alice胜出,且需要输出1: 1 #include ...

  8. 分析型CRM系统都分析什么?

    在之前的文章中我们曾经讲过,目前市面上常见的CRM系统大概可以分为通用型.协助型和分析型三种类型.由于每个企业的类型.业务的不同,就需要选择一款适合的CRM客户关系管理系统.今天我们就来说一说,分析型 ...

  9. Go快速入门(二)

    提示:本系列文章适合有其他语音基础并对Go有持续冲动的读者 一.package介绍 ​ Go语言的代码是通过package来组织的,package的概念和你知道的其它语言 里的libraries或者m ...

  10. VulnHub系列(一)DC-1

    环境 kali linux 和 DC-1 都是搭建在VMware上的虚拟机,都是NAT模式. 主机发现 NAT模式下虚拟机没有被分配真实的ip地址,他们通过共享宿主机的ip地址访问互联网.我们可以通过 ...