Java8之Optional类
写在前头
今天再看阿里的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类的更多相关文章
- 讲讲Java8的Optional类
前言 Java 8中引入了 Optional 类来解决 NullPointerException 与繁琐的 null 检查,该类首次出现在 Guava.Java 8 才成为类库中的一部分. 入门 Op ...
- java8新特性之Optional类
NullPointException可以说是所有java程序员都遇到过的一个异常,虽然java从设计之初就力图让程序员脱离指针的苦海,但是指针确实是实际存在的,而java设计者也只能是让指针在java ...
- 乐字节Java8核心特性之Optional类
大家好啊,上次小乐给大家介绍了Java8最最重要的一个特性——Stream流,点击可以回顾哦. Optional<T>类(java.util.Optional)是一个容器类,代表一个值存在 ...
- Java8新特性之空指针异常的克星Optional类
Java8新特性系列我们已经介绍了Stream.Lambda表达式.DateTime日期时间处理,最后以"NullPointerException" 的克星Optional类的讲解 ...
- Java8系列 (五) Optional类
概述 在Java8之前, 如果需要对一个变量做一次 null 检查, 通常会像下面这样写 T t = service1.query(); if (t != null) { K k = service2 ...
- Java8 新特性 Optional 类
Optional 类的简介 Optional类的是来自谷歌Guava的启发,然后就加入到Java8新特性中去了.Optional类主要就是为子决解价值亿万的错误,空指针异常. Optional ...
- java8新特性六-Optional 类
Optional 类是一个可以为null的容器对象.如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象. Optional 是个容器:它可以保存类型T的值,或者仅仅保 ...
- 夯实Java基础(二十四)——Java8新特征之Optional类
1.概述 对于Java程序员来说,到目前为止出现次数最多的应该是NullpointException,它是导致Java应用程序失败的最常见原因.之前处理空指针我们必须先通过条件先去判断,然后再确认是否 ...
- 【Java8新特性】不了解Optional类,简历上别说你懂Java8!!
写在前面 最近,很多读者出去面试都在Java8上栽了跟头,事后自己分析,确实对Java8的新特性一知半解.然而,却在简历显眼的技能部分写着:熟练掌握Java8的各种新特性,能够迅速使用Java8开发高 ...
随机推荐
- 记录opencv编译过程
准备学习opencv,参考了几个网页终于完成.编辑器和opencv版本都选择最新的版本. 记录过程如下 1. 下载准备: 1) Opencv源码, 下载地址: https://sour ...
- redis离线集群安装
用一个叫redis-trib.rb的ruby脚本.redis-trib.rb是redis官方推出的管理redis集群的工具,集成在redis的源码src目录下(redis-xxx/src/).是基于r ...
- Java解析json字符串和json数组
Java解析json字符串和json数组 public static Map<String, String> getUploadTransactions(String json){ Map ...
- 前端基础之JS
流程控制 if-else var a = 10; if (a > 5){ console.log("yes"); }else { console.log("no&q ...
- vue项目实践-添加express-mockjs进行数据模拟
mock-server 在新项目开始的时候,后端框架还没有,前端就有能够自己操作的模拟数据的服务是可以有的 express-mockjs 是楼教主结合 express+mock-lite 造的一个轮子 ...
- 【RL-TCPnet网络教程】第23章 RL-TCPnet之地址解析协议ARP
第23章 RL-TCPnet之地址解析协议ARP 本章节为大家讲解ARP(Address Resolution Protocol,地址解析协议),通过前面章节对TCP和UDP的学习,需要大家 ...
- Ubuntu 16.04安装Nginx
在Ubuntu下安装Nginx有以下方法,但是如果想要安装最新版本的就必须下载源码包编译安装. 一.基于APT源安装 sudo apt-get install nginx 安装好的文件位置: /usr ...
- #Java学习之路——基础阶段(第九篇)
我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...
- [Swift]LeetCode115. 不同的子序列 | Distinct Subsequences
Given a string S and a string T, count the number of distinct subsequences of S which equals T. A su ...
- 完整的http请求分析
首先我们要明白什么是http. http:超文本传输协议(HTTP,HyperText Transfer Protocol). 超文本传输协议是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...