吐槽 Java 8 的 Optional

2017-09-30 10:00:31 +08:00
 acr0ss

官方说是用于防止空指针的。
1.如果类的某个字段是 Optional,那就意味着 Nullable,会强制做 isPresent()判断是否为空
2.如果方法返回类型是 Optional,那就意味着 Nullable,也需要做 isPresent()判断是否为空

实际使用中,感觉对原有的返回类型,字段类型改动很大,所以没咋用。

同事却把这个 Optional 当成了炫技的手段。

一个为空的判断,只要 object == null 就可以;
同事却一直使用

!Optional.ofNullable(object).isPresent()  

同理非空判断是

Optional.ofNullable(object).isPresent()

哎呦我去,这个绕。

---吐槽します---

7112 次点击
所在节点    Java
32 条回复
xgfan
2017-09-30 10:05:41 +08:00
一个不做判断 null,IDE 会提示。
一个不做没有任何影响。
区别在这儿吧。



kotlin 解决这个问题更优雅。
gongzhang
2017-09-30 10:07:44 +08:00
😂optional 理念没问题,但死活不改 java 语法就只好这样了。。。
我还是觉得 @Nullable 和 @NotNull 更容易有效运用😂
acr0ss
2017-09-30 10:09:52 +08:00
@xgfan 问题是,非空判断不至于整的这么复杂吧。现在 IDEA 很只能,不做判断会提示可能空指针的。
gcli
2017-09-30 10:11:47 +08:00
microhz
2017-09-30 10:12:27 +08:00
连续做非空判断还是有简介的,可以减少 if 嵌套
QAPTEAWH
2017-09-30 10:16:28 +08:00
- Optional 是代替空指针的,该空的东西还是会空
- Optional 只能避免反复的 if (xxx != null), 不能避免 NullPointerException
- 正确用法是多用 .map, .orElse, 如果你处处在用.isPresent, 还不如用老办法
QAPTEAWH
2017-09-30 10:19:57 +08:00
- 空指针是“在类型系统上开了个洞”
kenken
2017-09-30 10:22:05 +08:00
map filter ifpresent orelse
huangchang250
2017-09-30 10:25:00 +08:00
应该吐槽的是你的同事
BoiledEgg
2017-09-30 10:25:35 +08:00
你同事滥用的问题
let xxx = {
"a": {
"b": {
"c": "content"
}
}
}

你要获取 c 的值, 如果只是获取值,看起来不用 Optional 还少些代码
return xxx!=null && xxx.a!=null && xxx.a.b!=null && xxx.a.b.c!=null?xxx.a.b.c: defaultC;
return Optional.ofNullable(xxx).map(xxx -> xxx.a).map(a -> a.b).map(b -> b.c).orElse(defaultC);
但是一旦要获取 a,b 后做计算,修改再获取 C 的值,不用 Optional 就只能 if else 嵌套再嵌套了。

事实上,Java 有 Optional,Javascript 也有个类似的库叫 data.maybe,里头也是 fromNullable 这套,毕竟链式调用看上去比 if else 嵌套要舒服。
chocotan
2017-09-30 10:33:02 +08:00
楼上们说的挺清楚了,我贴个书上的简单的栗子

mgcnrx11
2017-09-30 10:59:37 +08:00
zhx1991
2017-09-30 11:00:07 +08:00
object == null 的判断会被忘记
0915240
2017-09-30 11:16:40 +08:00
就是提醒处理 null 算是一种约束吧。


之前 guava 里面好像也是这么解释的。


另 orelse 之类针对 if null then default value 蛮好的。
incompatible
2017-09-30 11:27:53 +08:00
“实际使用中,感觉对原有的返回类型,字段类型改动很大,所以没咋用。"
这就是你的问题了。

如果你肯把方法的返回值写成 Optional,那么你同事也不用费劲地写 Optional.ofNullable()了
svenFeng
2017-09-30 11:41:24 +08:00
这东西得有模式匹配才能发挥真正的作用,直接在编译器杜绝空指针,参见 rust/haskell,而 Java 的话,这东西当作要判断空指针的标识就可以了
lihongjie0209
2017-09-30 11:45:51 +08:00
map 或者是 ifPresent, 上面这种用法是官方不推荐的, 因为这么用和用 null 没区别
lihongjie0209
2017-09-30 11:46:56 +08:00
具体内容可以看这个: <amp-youtube data-videoid="Ej0sss6cq14" layout="responsive" width="480" height="270"></amp-youtube>&t=25s
hantsy
2017-09-30 11:49:07 +08:00
@chocotan 这个正解。
没用过 Stream 的人很难理解 Optional,现在满世界都是 Steam/ Pipeline 了。

@acr0ss 照你这么说 Reactive Streams 设计全部是鸡肋了, Reactor/RxJava 是脱裤子放屁? Spring 5 的最大的特性就是引入全套 Reactive 支持,https://github.com/hantsy/spring-reactive-sample
lcgui7
2017-09-30 11:51:16 +08:00
@chocotan 这什么书?下面这个例子编译不通过吧。

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

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

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

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

© 2021 V2EX