JDK8新特性:使用Optional:解决NPE问题的更干净的写法

一、JDK8中Optional的方法使用介绍

空指针异Optional常是导致Java应用程序失败的最常见原因。以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码。受到Google Guava的启发,Optional类已经成为Java 8类库的一部分。Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。

Optional.of()或者Optional.ofNullable():创建Optional对象,差别在于of不允许参数是null,而ofNullable则无限制。

1 // 参数不能是null
2 Optional<Integer> optional1 = Optional.of(1);
3
4 // 参数可以是null
5 Optional<Integer> optional2 = Optional.ofNullable(null);
6
7 // 参数可以是非null
8 Optional<Integer> optional3 = Optional.ofNullable(2);  

Optional.empty():所有null包装成的Optional对象:

1 Optional<Integer> optional1 = Optional.ofNullable(null);
2 Optional<Integer> optional2 = Optional.ofNullable(null);
3 System.out.println(optional1 == optional2);// true
4 System.out.println(optional1 == Optional.<Integer>empty());// true
5
6 Object o1 = Optional.<Integer>empty();
7 Object o2 = Optional.<String>empty();
8 System.out.println(o1 == o2);// true  

isPresent():判断值是否存在

1 Optional<Integer> optional1 = Optional.ofNullable(1);
2 Optional<Integer> optional2 = Optional.ofNullable(null);
3
4 // isPresent判断值是否存在
5 System.out.println(optional1.isPresent() == true);
6 System.out.println(optional2.isPresent() == false);  

ifPresent(Consumer consumer):如果option对象保存的值不是null,则调用consumer对象,否则不调用

 1 Optional<Integer> optional1 = Optional.ofNullable(1);
 2 Optional<Integer> optional2 = Optional.ofNullable(null);
 3
 4 // 如果不是null,调用Consumer
 5 optional1.ifPresent(new Consumer<Integer>() {
 6     @Override
 7     public void accept(Integer t) {
 8         System.out.println("value is " + t);
 9     }
10 });
11
12 // null,不调用Consumer
13 optional2.ifPresent(new Consumer<Integer>() {
14     @Override
15     public void accept(Integer t) {
16         System.out.println("value is " + t);
17     }
18 });  

orElse(value):如果optional对象保存的值不是null,则返回原来的值,否则返回value

1 Optional<Integer> optional1 = Optional.ofNullable(1);
2 Optional<Integer> optional2 = Optional.ofNullable(null);
3
4 // orElse
5 System.out.println(optional1.orElse(1000) == 1);// true
6 System.out.println(optional2.orElse(1000) == 1000);// true  

orElseGet(Supplier supplier):功能与orElse一样,只不过orElseGet参数是一个对象

 1 Optional<Integer> optional1 = Optional.ofNullable(1);
 2 Optional<Integer> optional2 = Optional.ofNullable(null);
 3
 4 System.out.println(optional1.orElseGet(() -> {
 5     return 1000;
 6 }) == 1);//true
 7
 8 System.out.println(optional2.orElseGet(() -> {
 9     return 1000;
10 }) == 1000);//true  

orElseThrow():值不存在则抛出异常,存在则什么不做,有点类似Guava的Precoditions

 1 Optional<Integer> optional1 = Optional.ofNullable(1);
 2 Optional<Integer> optional2 = Optional.ofNullable(null);
 3
 4 optional1.orElseThrow(()->{throw new IllegalStateException();});
 5
 6 try
 7 {
 8     // 抛出异常
 9     optional2.orElseThrow(()->{throw new IllegalStateException();});
10 }
11 catch(IllegalStateException e )
12 {
13     e.printStackTrace();
14 }  

filter(Predicate):判断Optional对象中保存的值是否满足Predicate,并返回新的Optional。

 1 Optional<Integer> optional1 = Optional.ofNullable(1);
 2 Optional<Integer> optional2 = Optional.ofNullable(null);
 3
 4 Optional<Integer> filter1 = optional1.filter((a) -> a == null);
 5 Optional<Integer> filter2 = optional1.filter((a) -> a == 1);
 6 Optional<Integer> filter3 = optional2.filter((a) -> a == null);
 7 System.out.println(filter1.isPresent());// false
 8 System.out.println(filter2.isPresent());// true
 9 System.out.println(filter2.get().intValue() == 1);// true
10 System.out.println(filter3.isPresent());// false  

map(Function):对Optional中保存的值进行函数运算,并返回新的Optional(可以是任何类型)

1 Optional<Integer> optional1 = Optional.ofNullable(1);
2 Optional<Integer> optional2 = Optional.ofNullable(null);
3
4 Optional<String> str1Optional = optional1.map((a) -> "key" + a);
5 Optional<String> str2Optional = optional2.map((a) -> "key" + a);
6
7 System.out.println(str1Optional.get());// key1
8 System.out.println(str2Optional.isPresent());// false

flatMap():功能与map()相似,差别请看如下代码。flatMap方法与map方法类似,区别在于mapping函数的返回值不同。map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。

 1 Optional<Integer> optional1 = Optional.ofNullable(1);
 2
 3 Optional<Optional<String>> str1Optional = optional1.map((a) -> {
 4      return Optional.<String>of("key" + a);
 5 });
 6
 7 Optional<String> str2Optional = optional1.flatMap((a) -> {
 8      return Optional.<String>of("key" + a);
 9 });
10
11 System.out.println(str1Optional.get().get());// key1
12 System.out.println(str2Optional.get());// key1  

asdfjksdfsdf

看到了飞哥的

 1 

原文地址:https://www.cnblogs.com/laoxia/p/10875665.html

时间: 2024-10-09 18:48:03

JDK8新特性:使用Optional:解决NPE问题的更干净的写法的相关文章

一次电话Java面试的问题总结(JDK8新特性、哈希冲突、HashMap原理、线程安全、Linux查询命令、Hadoop节点)

面试涉及问题含有: Java JDK8新特性 集合(哈希冲突.HashMap的原理.自动排序的集合TreeSet) 多线程安全问题 String和StringBuffer JVM 原理.运行流程.内部结构 Linux 查询含有某字符串内容的命令grep 查询进程.GC状态.杀死进程 Hadoop五种节点介绍 -----------------------------------------------------------------------------------------------

JDK8 新特性

JDK8 新特性目录导航: Lambda 表达式 函数式接口 方法引用.构造器引用和数组引用 接口支持默认方法和静态方法 Stream API 增强类型推断 新的日期时间 API Optional 类 重复注解和类型注解 Lambda 表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升. 如下示例,将一个匿名类转换为Lambda表达

Java 8 新特性:Java 类库的新特性之 Optional类 ——诺诺&quot;涂鸦&quot;记忆

----------   诺诺学习技术交流博客.期待与您交流!    ---------- 详情请查看:http://blog.csdn.net/sun_promise  Java 类库的新特性之 Optional类 1.Optional简述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的

java进阶一之jdk8新特性

1.官方发布的jdk8新特性 2.51CTO相关专题

乐字节-Java8新特性之Optional

上一篇小乐带大家了解了Java新特性之Stream,接下来将会继续述说Java新特性之Optional Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在或不存在,原来用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 1.of 为非null的值创建一个Optional,如果值为null,则会抛出NullPointerException Optional<Integer> optional =

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

空指针异常是导致Java应用程序失败的最常见原因.以前,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guava通过使用检查空值的方式来防止代码污染,它鼓励程序员写更干净的代码.受到Google Guava的启发,Optional类已经成为Java 8类库的一部分.Optional实际上是个容器:它可以保存类型T的值,或者仅仅保存null.Optional提供很多有用的方法,这样我们就不用显式进行空值检测. Optional.of()或者Optional.of

jdk8新特性

jAVA8 十大新特性 投稿:junjie 字体:[增加 减小] 类型:转载 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API上的改进,比如流,函数式接口,Map以及全新的日期API "Java is still not dead-and people are starting to figure that out." 本教程将用带注释的简单代码来描述新特性,你将

类的加载、时机、反射、模板设计、jdk7/jdk8新特性(二十六)

1.类的加载概述和加载时机 * A:类的加载概述 * 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. * 加载 * 就是指将class文件读入内存,并为之创建一个Class对象.任何类被使用时系统都会建立一个Class对象. * 连接 * 验证 是否有正确的内部结构,并和其他类协调一致 * 准备 负责为类的静态成员分配内存,并设置默认初始化值 * 解析 将类的二进制数据中的符号引用替换为直接引用 * 初始化 就是我们以前讲过的初始化

JDK1.8新特性之Optional

概念 Optional 是JDK1.8中出现的一个容器类,代表一个值存在或者不存在.原来使用null表示一个值不存在,现在Optional可以更好的表达这个概念.并且可以避免空指针异常. 场景分析 需求:假如我们要取一个男人心中的女神的名字. 假如不使用Optional来实现 男人Man.java public class Man { private Goddess goddess; public Goddess getGoddess() { return goddess; } public v