写在前头

今天再看阿里的Java开发手册,里面异常处理第10条提到这样一个建议。

【推荐】防止 NPE ,是程序员的基本修养,注意 NPE 产生的场景:
1 ) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
反例: public int f() { return Integer 对象}, 如果为 null ,自动解箱抛 NPE 。
2 ) 数据库的查询结果可能为 null 。
3 ) 集合里的元素即使 isNotEmpty ,取出的数据元素也可能为 null 。
4 ) 远程调用返回对象时,一律要求进行空指针判断,防止 NPE 。
5 ) 对于 Session 中获取的数据,建议 NPE 检查,避免空指针。
6 ) 级联调用 obj . getA() . getB() . getC(); 一连串调用,易产生 NPE 。
正例:使用 JDK8 的 Optional 类来防止 NPE 问题。

里面的正确示例提示我们用Java8的Optional类来防止NPE的问题。

那我们今天就看看这个Optional类吧

Optional类

  • 类方法

序号 方法 & 描述
1 static <T> Optional<T> empty()

返回空的 Optional 实例。

2 boolean equals(Object obj)

判断其他对象是否等于 Optional。

3 Optional<T> filter(Predicate<? super <T> predicate)

如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。

4 <U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)

如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional

5 T get()

如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException

6 int hashCode()

返回存在值的哈希码,如果值不存在 返回 0。

7 void ifPresent(Consumer<? super T> consumer)

如果值存在则使用该值调用 consumer , 否则不做任何事情。

8 boolean isPresent()

如果值存在则方法会返回true,否则返回 false。

9 <U>Optional<U> map(Function<? super T,? extends U> mapper)

如果有值,则对其执行调用映射函数得到返回值。如果返回值不为 null,则创建包含映射返回值的Optional作为map方法返回值,否则返回空Optional。

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

返回一个指定非null值的Optional。

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

如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。

12 T orElse(T other)

如果存在该值,返回值, 否则返回 other。

13 T orElseGet(Supplier<? extends T> other)

如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。

14 <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier)

如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常

15 String toString()

返回一个Optional的非空字符串,用来调试

我们可以看到Optional总共也就10+个方法,其中有三个static方法。并且Optional的构造方法是private,不能new出来。

所以我们一般用这三个static来获取Optional的对象。

  • of && ofNullable

 public static <T> Optional<T> of(T value) {
return new Optional<>(value);
} public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}

很明显 of 对null对象没有做任何处理,ofNullable才做了处理。所以当我们不知道传入的对象是否为null的时候,我们应该选择用 ofNullable来做处理。

  • map

 public<U> Optional<U> map(Function<? super T, ? extends U> mapper) {
Objects.requireNonNull(mapper);
if (!isPresent())
return empty();
else {
return Optional.ofNullable(mapper.apply(value));
}
}

如果我们想获取Object里面的值的话,我们就需要用到这个map。

例子

 public class OptionalTest {
public static void main(String[] args) {
Person person = new Person("zhangsan", 18);
String name = getName(person);
System.out.println(name);
} private static String getName(Person person) {
if (Objects.isNull(person)) {
return "unKnown";
}
return person.getName();
} }

我们看上面的这个例子。

我们有一个函数 getName 作用是获取Person对象的名字。但我并不知道这个Person是否为Null。

所以我要进行一个判断,判断Person是否为空,在做决定。

但如果我们使用Optional类的话,我们可以这样写

 public class OptionalTest {
public static void main(String[] args) {
Person person = new Person("zhangsan", 18);
String name = getName(person);
System.out.println(name);
} private static String getName(Person person) {
String name = Optional.ofNullable(person).map(x -> x.getName())
.orElse("unKnown");
return name;
}
}

如果传入的为空,它会自动new一个  Optional<T> t = (Optional<T>) EMPTY; 

有效的处理到了null的问题,而且还非常的简洁。

Java8之Optional类的更多相关文章

  1. 讲讲Java8的Optional类

    前言 Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在 Guava.Java 8 才成为类库中的一部分. 入门 Op ...

  2. java8新特性之Optional类

    NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...

  3. 乐字节Java8核心特性之Optional类

    大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...

  4. Java8新特性之空指针异常的克星Optional类

    Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解 ...

  5. Java8系列 (五) Optional类

    概述 在Java8之前, 如果需要对一个变量做一次 null 检查, 通常会像下面这样写 T t = service1.query(); if (t != null) { K k = service2 ...

  6. Java8 新特性 Optional 类

    Optional 类的简介   Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常.   Optional ...

  7. java8新特性六-Optional 类

    Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...

  8. 夯实Java基础(二十四)——Java8新特征之Optional类

    1.概述 对于Java程序员来说,到目前为止出现次数最多的应该是NullpointException,它是导致Java应用程序失败的最常见原因.之前处理空指针我们必须先通过条件先去判断,然后再确认是否 ...

  9. 【Java8新特性】不了解Optional类,简历上别说你懂Java8!!

    写在前面 最近,很多读者出去面试都在Java8上栽了跟头,事后自己分析,确实对Java8的新特性一知半解.然而,却在简历显眼的技能部分写着:熟练掌握Java8的各种新特性,能够迅速使用Java8开发高 ...

随机推荐

  1. git教程——工作流程

    Git 工作流程 本章节我们将为大家介绍 Git 的工作流程. 一般工作流程如下: 克隆 Git 资源作为工作目录. 在克隆的资源上添加或修改文件. 如果其他人修改了,你可以更新资源. 在提交前查看修 ...

  2. 在浏览器输入URL时发生了什么

    浏览器器检查cache,如果请求对象已经缓存并且是最新的,执行第9步. 浏览器询问操作系统,请求服务器的IP地址 操作系统进行DNS查找,然后告诉浏览器服务器的IP 浏览器和服务器简历一个TCP连接( ...

  3. Session Cookie介绍和使用

    Cookie机制 Cookie机制 Cookie是服务器存储在本地计算机上的小块文本,并随每个请求发送到同一服务器. IETF RFC 2965 HTTP状态管理机制是一种通用的cookie规范. W ...

  4. 浅拷贝 &&&深拷贝 实现

    1.浅拷贝 //1.直接赋值给一个变量 //浅拷贝 //2.Object.assign() //浅拷贝 let obj4={} let obj5={money:50000} obj4.__proto_ ...

  5. dc的博客翻修计划启动

    紫书大部分学习完毕,等待一轮补完计划: 白书正在攻略中,进度百分之30: 博客翻修计划启动,我会在本学期内逐渐写系统性的学习笔记,我学习时遇到的困难的地方会有说明: 每个部分一定会放上经过验证的实现: ...

  6. Echarts 几个常用图

    最近公司业务上的 需求,要求做一些图表,我们技术框架上选择方便使用的Echarts. 下面是效果图: 下面是具体代码: <!DOCTYPE html> <html> <h ...

  7. [Swift]LeetCode146. LRU缓存机制 | LRU Cache

    Design and implement a data structure for Least Recently Used (LRU) cache. It should support the fol ...

  8. [Swift]LeetCode866. 回文素数 | Prime Palindrome

    Find the smallest prime palindrome greater than or equal to N. Recall that a number is prime if it's ...

  9. 想成为Python全栈开发工程师必须掌握的技能

    什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...

  10. Linux 的文件权限和目录配置

    1.Linux文件属性 用root用户登录linux后,执行 ls -al 命令查看文件.显示如下: 文件属性示意图如下: 第一列代表这个文件的类型和权限 第一个字符代表这个文件是:目录.文件或链接文 ...