网站首页 > 博客文章 正文
- 前情提要
女朋友突然在你面前拿出一个包包,问你这个包包是什么牌子?
你怎么办?当然是写段代码打印一下。
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登场了。
- Optional是啥
Optional类只是对类进行简单封装,没啥特殊的
public final class Optional<T> {
...
}
- 怎么创建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
2.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就这么多东西。
猜你喜欢
- 2024-10-09 java.util.Optional学习笔记(java.util.collection)
- 2024-10-09 如何使用Java8 Optional防止空指针异常?开发者:咋不早告诉我呢
- 2024-10-09 Java8新特性-Stream流&Optional类
- 2024-10-09 Java 8 开始新增的 Optional 类 - 创建 Optional 对象
- 2024-10-09 「Java 8」巧用Optional之优雅规避NPE问题
- 2024-10-09 优雅地解决空指针异常问题:Java8新特性之Optional
- 2024-10-09 JDK8中新增的Optional工具类真的很好用哦,建议收藏
- 2024-10-09 还在重复写空指针检查代码?考虑使用 Optional 吧
- 2024-10-09 Java 8 开始新增的 Optional 类 - Optional 对象中的返回
- 2024-10-09 软件开发 | Java8超实用新特性之——Optional解决空指针问题
你 发表评论:
欢迎- 07-07Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- 07-07Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- 07-07Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- 07-07Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- 07-07IT运维必会的30个工具(it运维工具软件)
- 07-07开源项目有你需要的吗?(开源项目什么意思)
- 07-07自动化测试早就跑起来了,为什么测试管理还像在走路?
- 07-07Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- 最近发表
-
- Xiaomi Enters SUV Market with YU7 Launch, Targeting Tesla with Bold Pricing and High-Tech Features
- Black Sesame Maps Expansion Into Robotics With New Edge AI Strategy
- Wuhan's 'Black Tech' Powers China's Cross-Border Push with Niche Electronics and Scientific Firepower
- Maven 干货 全篇共:28232 字。预计阅读时间:110 分钟。建议收藏!
- IT运维必会的30个工具(it运维工具软件)
- 开源项目有你需要的吗?(开源项目什么意思)
- 自动化测试早就跑起来了,为什么测试管理还像在走路?
- Cursor 最强竞争对手来了,专治复杂大项目,免费一个月
- Cursor 太贵?这套「Cline+OpenRouter+Deepseek+Trae」组合拳更香
- 为什么没人真的用好RAG,坑都在哪里? 谈谈RAG技术架构的演进方向
- 标签列表
-
- ifneq (61)
- 字符串长度在线 (61)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)