Java8引入了java.util.Optional<T>,它是一个封装的Optional值的类。变量存在时,Optional类只是对类简单封装。变量不存在时,缺失的值会被建模成一个空的Optional对象,由方法Optional.empty()返回。Optional.empty()是一个静态工厂方法,返回Optional类的特定单一实例。

  在代码中应始终如一的使用Optional,能非常清晰地界定出变量值的缺失时结构上的问题还是算法上的缺陷,抑或是数据中的问题。引入Optional并非要消除每个null引用,它的目标是帮助你更好的设计出适合的API。

  

  创建Optional对象

    声明一个空的Optional    

      Optional<Car> optCar = Optional.empty();

    创建一个非空的Optional,若car为null,则抛出NullPointerException

      Optional<Car>optCar = Optional.of(car);

    可接受null的Optional

      Optional<Car> optCar = Optional.ofNullable(car);

    

  Optional提供了一个map方法。map操作会将提供的函数应用于流的每个元素,可以把Optional对象看成一种特殊的集合数据,它至少包含一个元素。若Optional包含一个值,那map就讲该值作为参数传递给map,对该值进行转换。若Optional为空,则什么都不做。

    Optional<Instance> optInstance = Optional.ofNullable(instance);

    Optional<String> name = optInstance.map(Instance::getName);

  Optional提供了flatMap方法。flatMap方法接受一个函数作为参数,这个函数的返回值是另一个流。flatMap会应用到流中的每个元素并形成一个新的流,但flatMap会用流的内容替换每个新生成的流。即由方法生成的各个流会被合并或扁平化为一个单一的流。该调用逻辑上可划分为两步:第一。某个Function作为参数,被传递给由Optional封装的对象,对其进行转换。Function的具体表现是一个方法引用,返回一个Optional对象,最终两个Optional对象会被flatMap合并。可以将这种合并操作简单的看成把两个Optional对象结合在一起,若其中有一个对象为空,就构成一个空的Optional对象,若对一个空的Optional对象调用flatMap,则返回一个空的Optional。Optional类没有实现Serializable接口。

  Optional提供了isPresent()方法,若Optional对象包含值,则返回true。

  Optional提供了以下方法读取Optional实例中的值:

    get():若变量存在,则直接返回封装的变量值,否则抛出一个NoSuchElementException。

    orElse(T):允许在Optional对象不包含值时提供一个默认值

    orElseGet(Supplier<? extends T>):某个方法在Optional对象不含值时被调用

    orElseThrow(Supplier<? extends T>):当Optional不存在时抛出指定异常

    ifPresent(Consumer<? super T>):变量值存在时执行一个作为参数存在的方法

  Optional的filter方法接受一个谓词作为参数,若Optional对象存在并且它符合谓词的条件,filter方法就返回其值,否则它就返回一个空的Optional对象。

  Optional提供了基础类型的Optional,如OptionalInt,OptionalLong以及OptionalDouble。但是基础类型不支持map,flatMap及filter方法。Optional对象无法由基础类型的Optional组合构成。

用optional取代null的更多相关文章

  1. Java 8 (9) Optional取代null

    NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...

  2. 《Java 8 in Action》Chapter 10:用Optional取代null

    1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法.ALGOL W是第一批在堆上分配记录的类型语言之一.Hoare选择null引用这种方式,& ...

  3. java8 用Optional取代null

    如何处理null 怎样做才能避免不期而至的NullPointerException呢?通常,可以在需要的地方添加null的检查(过于激进的防御式检查甚至会在不太需要的地方添加检测代码),并且添加的方式 ...

  4. JDK8新特性:使用Optional避免null导致的NullPointerException

    空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写 ...

  5. Java8之使用Optional进行Null处理

    Optional类这是Java 8新增的一个类,用以解决程序中常见的NullPointerException异常问题,本篇文章将详细介绍Optional类,以及如何用它消除代码中的null检查. 1. ...

  6. Java8:使用 Optional 处理 null

    写过 Java 程序的同学,一般都遇到过 NullPointerException :) —— 为了不抛出这个异常,我们便会写如下的代码: User user = getUserById(id); i ...

  7. 使用Optional处理null

    一.聊聊NullPointerException   相比做Java开发的,见到NullPointerException肯定不陌生吧,可以说见到它深恶痛绝.在开发时认为不会出现NullPointerE ...

  8. 20145215《Java程序设计》第7周学习总结

    20145215<Java程序设计>第七周学习总结 教材学习内容总结 Lambda 认识Lambda语法 Lambda语法概述: Arrays的sort()方法可以用来排序,在使用sort ...

  9. 20145120 《Java程序设计》第7周学习总结

    20145120 <Java程序设计>第7周学习总结 教材学习内容总结 Lambda表达式 例:Comparator<String> byLength = (name1, na ...

随机推荐

  1. canvas移动端兼容性问题总结

    项目简介:在网页利用canvas在图片中动态绘制文字,合成一张图片,并导出 遇到的问题: 1.在移动端canvas drawImage()方法图片无法绘制出来,只显示文字 原因:图片未加载就进行绘制, ...

  2. leetcode-algorithms-36 Valid Sudoku

    leetcode-algorithms-36 Valid Sudoku Determine if a 9x9 Sudoku board is valid. Only the filled cells ...

  3. 克隆linux系统网卡问题

    如果没有 ifcfg-eth0  手动创建 删掉uuid uwaddr 保存退出 然后清空 >/etc/udev/rules.d/70-persistent-net.rules 然后重启 reb ...

  4. iOS性能优化总结

    iOS性能优化总结.关于 iOS 性能优化梳理: 基本工具.业务优化.内存优化.卡顿优化.布局优化.电量优化. 安装包瘦身.启动优化.网络优化等. 关于iOS 性能优化梳理: 基本工具.业务优化.内存 ...

  5. py requests.get

    import osimport requestsimport jsonfrom Util import Propertiesprint('########[公务员自助列表]############## ...

  6. Win10系列:VC++ Direct3D模板介绍2

    (3)CreateDeviceResources函数 CreateDeviceResources函数默认添加在CubeRenderer.cpp源文件中,此函数用于创建着色器和立体图形顶点.接下来分别介 ...

  7. shell script auto generate the relevant header information

    first : add follow context in   /etc/vim/vimrc set ignorecaseset cursorlineset autoindentautocmd Buf ...

  8. day28-python阶段性复习-基础二

    六.流程控制 if条件语句 #!/usr/bin/python if 1: print 'hello python' 1表示成立,0表示不成立       条件语句排断 if : 条件 elif: 添 ...

  9. day6-if,while,for的快速掌握

    python的缩进和冒号 python之所以如此简单,归功于它的缩进机制,严格的缩进机制是的代码非常整齐规范,赏心悦目,提高了可读性,在一定意义上提高了可维护性,但对于从其他语音转过来的朋友如:jav ...

  10. Java正则表达式的总结

    Java正则表达式,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. 判断用户的输入是否符合实际需求. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.] ...