Java 中的 Optional 应该什么时候用呢,总感觉这样不如直接 if 判断

2023-08-26 17:23:22 +08:00
 baolinliu442k

5009 次点击
所在节点    Java
39 条回复
hello2090
2023-08-26 17:25:16 +08:00
你随便 Google 一下就有了哇,你这里更好是用 pData.ifPresent()
bringyou
2023-08-26 17:31:24 +08:00
String username = Optional.ofNullable(people).ifPresent(People::getName).orElse(null);
javapythongo
2023-08-26 17:31:49 +08:00
需要从一个对象连续获取值的时候
```
String username = Optional.ofNullable(people).map(People::getName).orElse(null);
```
bitmin
2023-08-26 17:34:58 +08:00
String username = Optional.ofNullable(people).map(People::getName).orElse(null);

2# ifPresent void
Leviathann
2023-08-26 17:37:08 +08:00
chaining
baolinliu442k
2023-08-26 17:39:41 +08:00
@bringyou 太优雅了
BBCCBB
2023-08-26 17:46:11 +08:00
链式的时候可以用, 简单判断一个字段是否有值的时候, 真不如 if (xxx != null )
baolinliu442k
2023-08-26 17:46:14 +08:00
@javapythongo 确实好一点,那大哥,假如 People 对象里面还有一个 Job 对象, 我想获取里面的 jobName, 这种写法可以吗
baolinliu442k
2023-08-26 17:48:26 +08:00
@BBCCBB 因为我们项目有时候返回几十个字段,以前都是 String name = people == null ? "" : people.getName() 这样
fkdog
2023-08-26 17:48:46 +08:00
1. 可以在返回值里使用 optional ,提醒调用方这里返回的值可能为空,包装成 optional 对象就是强制要求调用者对空值情况进行判断处理。
2. 连续取值。比如你接到一个层级很复杂的 json 对象,将其转换成 map 结构,一层一层的 get 需要判断 null ,用 Optional 的话,就算是内嵌深度是 10 层,也能用一行 optional 解决,避免出现嵌套 10 层 if-else 判断
baolinliu442k
2023-08-26 17:48:52 +08:00
@Leviathann 链式调用吗
baolinliu442k
2023-08-26 17:50:29 +08:00
@bitmin 如果 api 这么设计好像也挺清晰的
baolinliu442k
2023-08-26 17:51:15 +08:00
@fkdog 这两点都还挺有用的,学到了
baolinliu442k
2023-08-26 17:51:27 +08:00
@hello2090 好哒
baolinliu442k
2023-08-26 17:58:56 +08:00
@baolinliu442k String jobName = Optional.ofNullable(people).map(People::getJob).map(Job::getJobName).orElse(null);
这样写也可以,嵌套对象取值还挺方便的
baolinliu442k
2023-08-26 18:01:45 +08:00
总结一下就是#10 楼大哥说的优势, 感谢大家的回复
arloor
2023-08-26 18:18:16 +08:00
可以减少代码行数,又不损失可读性的时候
Edward4074
2023-08-26 18:30:45 +08:00
在其他语法丰富的语言里就是
people?.job?.jobName??””
在 Java 里就只能是这样了
hello2090
2023-08-26 18:32:29 +08:00
@Edward4074 Groovy!
cnt2ex
2023-08-26 19:36:51 +08:00
因为 null 指针的引入本身就是个历史错误。用 Optional 类型改正了这个历史错误。

虽然在一些情况下,和写检查 null 一样。但是引入了 Optional 类型相当于强制你做检查了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/968493

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX