java8,你应该了解的新特性(空指针终结者:Optional 类)
2017-09-16 11:04
453 查看
1、java.lang.NullPointerException是最常见也是最令人讨厌的一种异常,如果一个对象可能为null,在调用其方法之前必须进行非空检查,否则就会引发java.lang.NullPointerException。但是,很多对象永远都不会为null,如果能把那些可能为null的对象明确的标识出来,只对null嫌疑者进行判断,岂不是既可避免java.lang.NullPointerException有可避免不必要的非空判断?
Optional 类(java.util.Optional) 是一个容器类,它明确指示开发者哪些对象需要非空检查的。代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
2、常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
3、演示
测试实体类
(1)Optional.of(T t) 演示
注意:在测试时,我们会直接new一个对象,但是在实际开发中,可能会传入某个对象,当这个对象为空时依然会报空指针异常。如下图。
(2)Optional.empty()会给我们创建一个本身就是空的Optional 实例。Optional.ofNullable(T t)会先进行判断,当传入的对象不为空时,调用of()方法,当对象为空时,调用.empty()方法。
(3)isPresent() : 判断是否包含值
注意:如果我们直接使用of()方法创建的Optional实例,如果传入的是null,则该判断依然会报NullPointerException
分析
当传入null时,ofNullable会进行null判断,当时of不会进行判断。而是直接调用new Optional<>(value)方法创建实例,而Optional在创建实例时会调用Objects的requireNonNull(value)方法进行非空校验,当时null值时,会抛出NullPointerException错误。
(4)orElse(T t)与orElseGet(Supplier s)
当传入的对象不为空时:
当传入的对象为空时:
orElseGet(Supplier s)区别在于,传入的为Supplier(供给型接口),可以对对象进行相对于的操作。
(5)map(Function f)与flatMap(Function mapper)
区别:两个方法的返回值类型不同,以示例为例,map要求返回值类型是Emp及其子类,而flatmap则要求返回值类型必须为Optional 。
4、应用
(1)假设UserDao不一定会被注入进UserService,原来必须使用@Autowired(required = false),但是现在直接使用Optional即可。
(2)在Spring MVC中,下面的代码表示userName参数是可选的,即请求参数可不包含userName。
Optional 类(java.util.Optional) 是一个容器类,它明确指示开发者哪些对象需要非空检查的。代表一个值存在或不存在,原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
2、常用方法:
Optional.of(T t) : 创建一个 Optional 实例
Optional.empty() : 创建一个空的 Optional 实例
Optional.ofNullable(T t):若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent() : 判断是否包含值
orElse(T t) : 如果调用对象包含值,返回该值,否则返回t
orElseGet(Supplier s) :如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f): 如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper):与 map 类似,要求返回值必须是Optional
3、演示
测试实体类
(1)Optional.of(T t) 演示
注意:在测试时,我们会直接new一个对象,但是在实际开发中,可能会传入某个对象,当这个对象为空时依然会报空指针异常。如下图。
(2)Optional.empty()会给我们创建一个本身就是空的Optional 实例。Optional.ofNullable(T t)会先进行判断,当传入的对象不为空时,调用of()方法,当对象为空时,调用.empty()方法。
(3)isPresent() : 判断是否包含值
注意:如果我们直接使用of()方法创建的Optional实例,如果传入的是null,则该判断依然会报NullPointerException
分析
当传入null时,ofNullable会进行null判断,当时of不会进行判断。而是直接调用new Optional<>(value)方法创建实例,而Optional在创建实例时会调用Objects的requireNonNull(value)方法进行非空校验,当时null值时,会抛出NullPointerException错误。
(4)orElse(T t)与orElseGet(Supplier s)
当传入的对象不为空时:
当传入的对象为空时:
orElseGet(Supplier s)区别在于,传入的为Supplier(供给型接口),可以对对象进行相对于的操作。
(5)map(Function f)与flatMap(Function mapper)
区别:两个方法的返回值类型不同,以示例为例,map要求返回值类型是Emp及其子类,而flatmap则要求返回值类型必须为Optional 。
4、应用
(1)假设UserDao不一定会被注入进UserService,原来必须使用@Autowired(required = false),但是现在直接使用Optional即可。
(2)在Spring MVC中,下面的代码表示userName参数是可选的,即请求参数可不包含userName。
相关文章推荐
- java8,你应该了解的新特性(并行流优化篇)
- java8,你应该了解的新特性(新时间与日期API)
- java8,你应该了解的新特性(Stream API篇)
- Java8新特性7--使用Optional解决空指针问题
- java8,你应该了解的新特性(Lambda篇)
- 简单了解JAVA8的新特性
- java程序猿应该了解的10个面向对象设计原则(每次看都很有感悟,特意拿来和大家共享)
- Java 8 新特性,Lambda,方法引用,Stream,Optional
- 你应该远离的6个Java特性
- Java函数式开发 Optional空指针处理
- Java 程序员应该了解的 10 个面向对象设计原则
- Java程序员应该了解的10个设计原则
- Java程序员应该了解的10个面向对象设计原则
- Java8中新特性Optional、接口中默认方法和静态方法详解
- Java9都快发布了,Java8的十大新特性你了解多少呢?
- 你应该远离的6个Java特性
- 【译】使用示例带你提前了解 Java 9 中的新特性
- Java8新特性Optional、接口中的默认方法与静态方法
- Java 8th 新特性:Optional类
- Java程序员应该了解的10个面向对象设计原则