Java 8 之 Optional
Java 8 之 Optional
背景介绍:在我们实际开发中,经常会遇到各种 NullPointerException 报错,为了避免此类问题,需要在业务代码上添加各种if判断,使代码看起来很臃肿,而且很不美观
使用Optional 提供的各种方法,能够很好的解决上述的问题,下面介绍一下Optional的基础API
准备工作:新建一个User类及Address类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private String id;
private String name;
private Address address;
}
@NoArgsConstructor
@AllArgsConstructor
@Data
public class Address {
private String province;
private String city;
}
1.orElse
当value为null时,取value1,否则取value
User user = null;
// 1.user为null时
User user1 = new User("001", "user1", null);
User result = Optional.ofNullable(user).orElse(user1);
System.out.println(result); // 输出 User(id=001, name=user1, address=null)
// 2.user 不为null时
user = new User("000","user",null);
result = Optional.ofNullable(user).orElse(user1);
System.out.println(result); //输出 User(id=000, name=user, address=null)
2.orElseThrow
当value为null时,抛出参数中指定的异常
User user = null;
// 写法1
User result = Optional.ofNullable(user).orElseThrow(NullPointerException::new);
// 写法2
User result = Optional.ofNullable(user).orElseThrow(()->new Exception("user为空"));
3.orElseGet
如果存在则返回该值,否则调用other值并返回该调用的结果。
User user = null;
User result = Optional.ofNullable(user).orElseGet(()->new User("1111","other",null));
System.out.println(result); // 输出 User(id=1111, name=other, address=null)
4.isPresent
如果存在值,则返回true ,否则返回false
User user = null;
boolean present = Optional.ofNullable(user).isPresent();
System.out.println(present); // false
User user1 = new User();
boolean present1 = Optional.ofNullable(user1).isPresent();
System.out.println(present1); // true
5.ifPresent
如果 存在值,则执行定义代码,否则什么也不做。
User user = null;
Optional<User> user1 = Optional.ofNullable(user);
user1.ifPresent(u -> System.out.println(u)); // 什么都不输出
User user = new User();
Optional<User> user1 = Optional.ofNullable(user);
user1.ifPresent(u -> System.out.println(u)); // User(id=null, name=null, address=null)
6.map
如果存在值,则对其应用提供的映射函数,如果结果为非 null,则返回描述结果的Optional 。否则返回一个空的Optional
Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address);
String s = Optional.ofNullable(user)
.map(u -> u.getAddress())
.map(address1 -> address1.getCity())
.orElseThrow(() -> new Exception("111"));
System.out.println(s); // 杭州
7.flatMap
如果存在值,则将提供的Optional函数应用于它,返回该结果,否则返回空Optional 。与map的不同是 flatMap提供的函数必需是Optional的
Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address)
Optional<String> s1 = Optional.ofNullable(user)
.flatMap(user1 -> Optional.of(user1.getAddress()))
.flatMap(address1 -> Optional.of(address1.getCity()));
System.out.println(s1.orElse("null")); // 杭州
8.filter
对 Optional 中包含的值进行过滤,如果包含的值满足条件,那么还是返回这个 Optional;否则返回 Optional.empty。
Address address = new Address("浙江","杭州");
User user = new User();
user.setId("001");
user.setName("ll");
user.setAddress(address);
String a = Optional.ofNullable(user)
.filter(user1 -> user1.getId().equals("001"))
.map(user1 -> user1.getId())
.orElse("null");
System.out.println(a); // 001
String b = Optional.ofNullable(user)
.filter(user1 -> user1.getId().equals("002"))
.map(user1 -> user1.getId())
.orElse("null");
System.out.println(b); // null
Java 8 之 Optional的更多相关文章
- map和flatmap的区别+理解、学习与使用 Java 中的 Optional
转自:map和flatmap的区别 对于stream, 两者的输入都是stream的每一个元素,map的输出对应一个元素,必然是一个元素(null也是要返回),flatmap是0或者多个元素(为n ...
- 理解、学习与使用 Java 中的 Optional
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...
- 理解、学习与使用 JAVA 中的 OPTIONAL<转>
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都 ...
- 如何更好地使用Java 8的Optional
Java 8中的Optional<T> 是一个可以包含或不可以包含非空值的容器对象,在 Stream API中很多地方也都使用到了Optional. java中非常讨厌的一点就是nullp ...
- Tomcat上java.lang.IllegalStateException: Optional int parameter 'id' is not present
今日, 本人在tomcat+spring mvc平台的服务器上遇到java.lang.IllegalStateException: Optional int parameter 'id' is not ...
- 理解、学习与使用 JAVA 中的 Optional【转载】
这是一篇转载的文章.刚学java的时候看了好久这个Optional,但一直是懵的.今天又又遇到了,重新回来再看的时候,发现并没有那么难道那个. 转载的文章再开头处写了一个对于理解Optional很关键 ...
- JAVA 中的Optional (臭名昭著的空指针异常(NullPointerException))
从 Java 8 引入的一个很有趣的特性是 Optional 类.Optional 类主要解决的问题是臭名昭著的空指针异常(NullPointerException) -- 每个 Java 程序员都 ...
- 理解、学习与使用Java中的Optional
从Java8 引入的一个很有趣的特性是Optional类.Optional类主要解决的问题是臭名昭著的空指针异常(NullPointerException) —— 每个 Java 程序员都非常了解的异 ...
- Java 8 (9) Optional取代null
NullPointerException,大家应该都见过.这是Tony Hoare在设计ALGOL W语言时提出的null引用的想法,他的设计初衷是想通过编译器的自动检测机制,确保所有使用引用的地方都 ...
随机推荐
- Java反射使用方法
//简单的例子public class ReflextionMain { public static void main(String[] args) throws ClassNotFoundExce ...
- 问题描述 ens33 不见了
事情是这样紫的 我今天用Xshell 连接Linux 发现连接不上去百思不得其解,然后就去Linux里看 ifconfig 的配置,然后发现 ens33居然不见了,就只有lo 和 virbr() , ...
- 如何看懂时序图,以DHT21为例
有很多传感器手册给了我们时序图,我们只要按照时序图操作就行了,还有一些是标准接口,例如SPI,IIC,UART,这些可以利用硬件提供的收发器通信,还有一些我们没有足够的接口,或者没有对应的接口与之通信 ...
- 我们一起来学Shell - 初识shell
文章目录 Shell 的分类 `bash` `csh` `ksh` `tcsh` `sh` `nologin` `zsh` Shell 能做什么 bash 环境变量文件 `/etc/profile` ...
- BeanFactory与FactoryBean有什么区别?
相同点:都是用来创建bean对象的 不同点:使用beanFactory创建对象的时候,必须要遵循严格的生命周期流程,太复杂了,如果想要简单的自定义某个对象的创建,同时创建好的对象想要交给spring来 ...
- [自动化]基于kolla-ansible部署的openstack自动化巡检生成xlsx报告
自动化巡检介绍 此巡检项目在kolla-ansible部署的openstack环境上开发,利用ansible-playbook编排的功能,对巡检的任务进行编排和数据处理.主要巡检的对象有IaaS平台和 ...
- jmeter变量嵌套:__V
问题复现 ${name_${n}} 下面没有获取到结果 解决方案 __V是用于执行变量名表达式 ${__V(name_${n})} 获取到结果
- Wireshark教程之高级功能
实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.数据流追踪功能 2.协 ...
- S32Kxxx bootloader之CAN bootloader
了解更多关于bootloader 的C语言实现,请加我Q扣: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 最近完成了S32Kxx ...
- 网络测试仪实操手册 RENIX 机框管理
本文主要阐述信而泰BIGTAO系列 网络测试仪器机框相关操作方法.文章分为机框添加.机框删除.机框重启.机框关机四部分. 第一部分:机框添加 1.添加过程 1.1打开软件 1.2添加端口 1.3输入I ...