Java8 Optional总结
1、构造方式
Optional 的三种构造方式: Optional.of(obj), Optional.ofNullable(obj) 和 Optional.empty()
1.1、Optional.of(obj)
它要求传入的 obj 不能是 null 值的, 否则 NullPointerException.
使用场景:
1. 当我们非常非常的明确将要传给 Optional.of(obj) 的 obj 参数不可能为 null 时;
2. 当obj 为 null 立即报告 NullPointException 异常, 而不是隐藏空指针异常时.
1.2、Optional.ofNullable(obj)
传 null 进到就得到 Optional.empty(), 非 null 就调用 Optional.of(obj).
1.3、Optional.empty()
内部value是null
2、不推荐的使用方式
- Optional<User> user = ……
- if (user.isPresent()) {
- return user.getOrders();
- } else {
- return Collections.emptyList();
- }
这种方式和我们直接使用obj != null做判断没什么区别。实际上,当我们还在以如下几种方式使用 Optional 时, 就说明你的使用方式可能有问题:
(1)调用 isPresent() 方法时或者调用 get() 方法时。这两种方法应该认为是private的,你最好不要直接使用。
(2)Optional 类型作为类/实例属性时。Optional 类型不可被序列化, 用作字段类型会出问题
(3)Optional 类型作为方法参数时。
3、正确的使用方式
Optional 中我们真正可依赖的应该是除了 isPresent() 和 get() 的其他方法:
- public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
- public T orElse(T other)
- public T orElseGet(Supplier<? extends T> other)
- public void ifPresent(Consumer<? super T> consumer)
- public Optional<T> filter(Predicate<? super T> predicate)
- public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
- public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
3.1、存在则返回数据
3.1.1、orElse
存在即返回, 无则提供默认值
return user.orElse(null);
return user.orElse(UNKNOWN_USER);
3.1.2、orElseGet
存在即返回, 无则由函数来产生
return user.orElseGet(() -> fetchAUserFromDatabase());
3.1.3、orElseThrow
存在即返回, 无则抛出supplier接口创建的异常。
try {
empty.orElseThrow(ValueAbsentException::new);
} catch (Throwable ex) {
System.out.println(ex.getMessage());
}
3.2、存在则执行某个动作
3.2.1、ifPresent
存在才对它做点什么
user.ifPresent(System.out::println);
//等同于
if (user.isPresent()) {
System.out.println(user.get());
}
3.3、存在则转换成另一个Optional
3.3.1、map
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
如果有值,则对其执行调用mapping函数得到返回值。如果返回值不为null,则创建包含mapping返回值的Optional作为map方法返回值,否则返回空Optional。
- Optional<String> name2 = Optional.of("deff");
- Optional<String> s = name2.map((value) -> value.toUpperCase());
- System.out.println(s.orElse("No value found"));//DEFF
- Optional<String> name2 = Optional.ofNullable(null);
- Optional<String> s = name2.map((value) -> value.toUpperCase());
- System.out.println(s.orElse("No value found"));//No value found
//之前的做法
if(user.isPresent()) {
return user.get().toUpperCase();
} else {
return Collections.emptyList();
}
map 是可能无限级联的, 比如再深一层, 获得用户名的大写形式
return user.map(u -> u.getUsername())
.map(name -> name.toUpperCase())
.orElse(null);
3.3.2、flatMap
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
如果有值,为其执行mapping函数返回Optional类型返回值,否则返回空Optional。
flatMap与map(Funtion)方法类似,区别在于传入方法的lambda表达式的返回类型。
map方法的mapping函数返回值可以是任何类型T,而flatMap方法的mapping函数必须是Optional。
- Optional<String> name = Optional.of("Abc");
- Optional<String> upperName = name.flatMap((value) -> Optional.of(value.toUpperCase()));
- System.out.println(upperName.orElse("No value found"));//ABC
3.5、存在则做过滤
3.5.1、filter
检查给定的Option值是否满足某些条件。如果满足则返回同一个Option实例,否则返回空Optional。
Optional<String> longName = name.filter((value) -> value.length() > 6)
4、总结:
用了 isPresent() 处理 NullPointerException 不叫优雅, 有了 orElse, orElseGet 等, 特别是 map 方法才叫优雅.
使用 Optional 时尽量不直接调用 Optional.get() 方法, Optional.isPresent() 更应该被视为一个私有方法, 应依赖于其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等这样的方法
Java8 Optional总结的更多相关文章
- Java8 Optional的简单操作
我们经常会遇到这种情况:首先判断一个对象是否为null,如果不为null,获取一个对象中的一个属性,如果该属性不为null,又获取该属性的属性,如果该属性的属性不为null,又获取属性的属性的属性: ...
- java8 Optional优雅非空判断
java8 Optional优雅非空判断 import java.util.ArrayList;import java.util.List;import java.util.Optional; pub ...
- Java8 Optional && Guava Optional
Java8 -- Optional boolean isPresent():与obj != null()一样:调用get()前要调用isPresent()检查,不然会报错 Optional的三种构造方 ...
- java代码之美(16) ---Java8 Optional
Java8 Optional 一句话介绍Optional类:使用JDK8的Optional类来防止NullPointerException(空指针异常)问题. 一.前言 在我们开放过程中,碰到的异常中 ...
- java8 Optional使用总结
[前言] java8新特性 java8 函数接口 java8 lambda表达式 Java 8 时间日期使用 java8 推出的Optional的目的就是为了杜绝空指针异常,帮助开发者开发出更优雅的代 ...
- 聊一聊Java8 Optional,让你的代码更加优雅
码农在囧途 随着时间的推移,曾经我们觉得重要的东西,可能在今天看来是如此的浅薄和无知,同理,今天我们放不下,想不开,觉得重要的东西,多年后我们可能也会觉得也就那样,所以,今天的的所有烦恼,忧愁,想不开 ...
- 使用 Java8 Optional 的正确姿势(转)
我们知道 Java 8 增加了一些很有用的 API, 其中一个就是 Optional. 如果对它不稍假探索, 只是轻描淡写的认为它可以优雅的解决 NullPointException 的问题, 于是代 ...
- Java8 Optional类
概述 到目前为止,著名的NullPointerException是导致Java应用程序失败的最常见原因.过去,为了解决空指针异常,Google公司著名的Guava项目引入了Optional类,Guav ...
- java8 Optional正确使用姿势
Java 8 如何正确使用 Optional import lombok.Data; import lombok.EqualsAndHashCode; import lombok.ToString; ...
- java8 - Optional
mport java.util.Optional; import org.junit.Test; /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) ...
随机推荐
- weblogic删除域
彻底删除weblogic域的方法: 例如:删除域名为:fm_ump的域 第一步,删除域注册记录: [bofm@UAT02-BIZ-ZJCG-AP-008 Middleware]$ cd /home/s ...
- pipenv管理python开发环境
简介 简单说,pipenv就是把pip和virtualenv包装起来的一个便携工具. 它不会在你的项目文件夹里生成一大堆东西,只有两个文本文件: Pipfile, 简明地显示项目环境和依赖包. Pip ...
- 使用BurpSuite做中转代理时候出现Failed to connect to www.xxx.com:443 的时候可能原因
1.可能是BurpSuite没有设置好代理,需要BurpSuite需要进行设置如下图:
- (八)OpenStack---M版---双节点搭建---Cinder安装和配置
↓↓↓↓↓↓↓↓视频已上线B站↓↓↓↓↓↓↓↓ >>>>>>传送门 1.创建数据库并授权 2.获得admin凭证执行管理员命令并创建服务证书 3.创建块存储设备AP ...
- 安装系统时出现 Windows无法打开所需的文件 C:\Sources\install.wim 的解决办法
使用U盘安装Win10的时候,出现 Windows无法打开所需的文件 C:\Sources\install.wim,错误代码:0x8007000D,这是由于启动盘里 install.wim 文件不正确 ...
- 201871010111-刘佳华《面向对象程序设计(java)》第二周学习总结
201871010111-刘佳华<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daiz ...
- Virtualbox 修改硬盘的序列号等信息 例
Virtualbox 修改硬盘的序列号等信息 例 http://blog.csdn.net/eidolon8/article/details/42709365 原创 2015年01月14日 14:24 ...
- 编译安装PHP以及需要的基本扩展库(php7.4)
安装配置选项1: ./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql --with-curl --with-freety ...
- nowcoder911J 异或的路径
题目链接 题意 给出一棵树,每条边有边权.求\(\sum\limits_{i=1}^n{f(i,j)}\),\(f(i,j)\)表示从i到j路径的异或和. 思路 \(g_i\)表示从根到\(i\)的异 ...
- 性感VSCODE在线刷LeetCode的题
安装Nodejs并勾选添加到PATH VSCODE安装插件LeetCode 注册LeetCode账号(注意CN国区和国际区账号不通用),重启VSCODE并点左边栏那个LeetCode图标sign in ...