向女朋友解释Java8 Optional 到底干啥用的?
2020/3/15 17:01:24
本文主要是介绍向女朋友解释Java8 Optional 到底干啥用的?,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
前情提要
女朋友突然在你面前拿出一个包包,问你这个包包是什么牌子? 你怎么办?当然是写段代码打印一下。
public class Boy { // new出一个女朋友 private GirlFriend girlFriend; public GirlFriend getGirlFriend() { return girlFriend; } } public class GirlFriend { // 对于女朋友来说,包治百病 private Bag bag; public Bag getBag() { return bag; } } public class Bag { // 买包,是Gucci还是Prada,你看着办 private String name; public String getName() { return name; } } class Test { // 打印一下女朋友包包的名字 public String getGirlFriendBagName(Boy boy) { return boy.getGirlFriend().getBag().getName(); } } 复制代码
当你开心的执行这个方法的时候,遇到了意想不到的事。
Exception in thread "main" java.lang.NullPointerException at com.yideng.Test.getGirlFriendBagName(Boy.java:33) at com.yideng.Test.main(Boy.java:38) 复制代码作为一个专业的程序员都知道,使用对象之前,要进行判空,于是就是这样。
// 打印一下女朋友包包的名字 public String getGirlFriendBagName(Boy boy) { if (boy != null) { if (boy.getGirlFriend() != null) { if (boy.getGirlFriend().getBag() != null) { return boy.getGirlFriend().getBag().getName(); } } } return null; } 复制代码
层层判空,你是一个优秀的程序员,肯定看不惯如此冗余的代码,有没有解决办法呢?于是Optional登场了。
1. Optional是啥
Optional类只是对类进行简单封装,没啥特殊的
public final class Optional<T> { ... } 复制代码
2. 怎么创建Optional类
2.1 声明一个空的Optional
Optional<Boy> optBoy = Optional.empty(); 复制代码
这时候,optBoy相当于null,不过使用optBoy不会报NullPointerException
2.2 创建一个非空的Optional
Optional<Boy> optBoy = Optional.of(boy); 复制代码
如果传入boy是null,直接报NullPointerException
3. 创建一个接受null的Optional
Optional<Boy> optBoy = Optional.ofNullable(boy); 复制代码
如果传入的boy是null,也不会报错。
3. 如何使用Optional类
3.1 提取Optional对象的属性
Optional<GirlFriend> girlFriend = optBoy.map(Boy::getGirlFriend); 复制代码
这里的map和stream流中的map用法一样,都可以传入一个Function函数,处理对象。
3.2 提前判空对象
optBoy.ifPresent(boy -> System.out.println(boy)); 复制代码
如果optBoy是Optional.empty(),就不会执行后面打印方法。
3.3 判空方法提取成if语句
if (optBoy.isPresent()) { System.out.println(optBoy); } 复制代码
如果optBoy是Optional.empty(),isPresent返回false,就不会执行if里面的语句。
3.4 获取Optional对象的属性值
Boy boy = optBoy.get(); 复制代码
如果optBoy是Optional.empty(),会抛出异常java.util.NoSuchElementException: No value present
3.5 给属性设定默认值
Boy boy = optBoy.orElse(new Boy()); 复制代码
如果optBoy不是Optional.empty(),就直接返回,否则返回默认值new Boy()
3.6 过滤Optional对象
// 不是Gucci的包不要 boolean isGucci = optBag.filter( bag -> !"Gucci".equals(bag.getName())) .isPresent(); 复制代码
4. 用Optional改写原来的方法
public String getGirlFriendBagName(Optional<Boy> optBoy) { return optBoy.map(Boy::getGirlFriend) .map(GirlFriend::getBag) .map(Bag::getName) .orElse("Gucci"); } 复制代码
是不是优雅了许多,到此完事,Optional就这么多东西。
这篇关于向女朋友解释Java8 Optional 到底干啥用的?的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求
- 2024-10-01使用 golang 将ETH账户的资产平均分散到其他账户
- 2024-10-01JWT用户校验课程:从入门到实践
- 2024-10-01Server Component课程入门指南
- 2024-09-30Dnd-Kit学习:新手快速入门指南