JAVA8 的 Optional 是鸡肋

2021-01-25 15:00:29 +08:00
 mightofcode
对于处理 NPE 问题基本没有帮助

不使用 Optional,你得判空
使用 Optional,你还是得判空,只是换了一种形式
引入 Optional 降低代码可读性,代码变得丑陋

我在工作中从没见到有项目使用 Optional
除了使用 java stream 不得不用到 Optional

本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
13121 次点击
所在节点    Java
118 条回复
James369
2021-01-26 13:41:50 +08:00
非常的好用,我都恨 C++不引入 Optional
wutiantong
2021-01-26 13:46:54 +08:00
James369
2021-01-26 13:56:57 +08:00
@wutiantong 在我看来这只是类层面的曲线救国的实现,没有语法糖来得甜。比如 swift 中的 optional,语言自带,很简洁很爽。
James369
2021-01-26 13:58:37 +08:00
@wutiantong kotlin/swift 才是真正的爽,c++/java 都是后天弥补。
yazinnnn
2021-01-26 14:10:12 +08:00
不如一步到胃引入 either ,变得更函数式一些
wutiantong
2021-01-26 14:10:50 +08:00
@James369 曾经也写过 swift,链式的?和??的设计确实不错。但代码中过多的感叹号和问号真的会影响观感和可读性。

究其根源在于他们的标准库从上一代( Obj-C,Java )一脉相承,里面难免带入了很多 nullable 语义,导致实际代码中 optional 类型极度泛滥。

反观现代 C++,在最佳实践中大部分类型都遵循值语义,天然是非空的,所以根本就不需要考虑 optional 操作,只有在你需要 optional 语义的地方才会引入 optional 类型。所以可读性方面反而明显更佳。
tairan2006
2021-01-26 14:17:35 +08:00
Rust 最好,强制你用…swift 那种也挺好,比较方便…

Java 这个只能在链式操作上用,就一般般了…

而且用 ide 写 if(x != null)并不是很麻烦,Golang 还一步一检查 if err != nil 呢…
djFFFFF
2021-01-26 14:27:10 +08:00
用过 Scala 的 Option 之后,确实觉得 Java 的 Optional 有点鸡肋。
hahasong
2021-01-26 14:57:01 +08:00
Optional 不是 swift 里的么,理想很美好,搬过来没那味了
psyche
2021-01-26 17:53:20 +08:00
我们项目里面就用了很多 Optional,如果下属返回个 null == Optional,第一次可以教,屡教不改的叫他滚就行。如果是隔壁合作的项目组,我自己没权限开人,可以要求上司换人合作,他不走我走呗。
楼主所在的项目组很难招到靠谱的人吗?如果是的话建议跳槽。
人生苦短,为这些事情烦恼挺无聊的。
yannxia
2021-01-26 18:07:51 +08:00
用 Optional == null 都算是没什么必要的改造,Option.fromNullable(xxx).map().map().map().else() 才需要
ztcaoll222
2021-01-26 18:18:49 +08:00
能做到明明返回是 optional 结果还要调用的人判断是否为 null 的人不赶紧开了留着害人?
chocotan
2021-01-26 18:21:15 +08:00
“我在工作中从没见到有项目使用 Optional
除了使用 java stream 不得不用到 Optional”
我在工作中见到很多项目使用 Optional
除了使用 java stream 外,很多地方都在用 Optional
James369
2021-01-26 21:07:02 +08:00
@wutiantong swift 的链式写法,as?类型转换,try?尝试等等,真的节省很多冗余代码。我觉得真的爽。
zeni123
2021-01-26 21:41:56 +08:00
Optional 还是挺好用的 代表了另一种编程思想 可能楼主不习惯 不是一定要用不可
by73
2021-01-26 22:10:04 +08:00
这不是优化吧,只是单纯的想解决 NPE 问题,只是 Java 提供的方案有点不太好看罢了。如果用 IDEA 的话,可以用一些 @Notnull 注解让 IDEA 帮你稍微看一眼(好像是这个)。

实际上这种东西都是希望帮你在编译期解决一些潜在的问题罢了,像 Optional,万一哪个地方就是忘了进行判断呢? Rust 诞生基本也是这种思路,只是更加强制。不过 Optional 总体思路是好的,只是在 Java 上是有点“啰嗦”,我猜你工作中应该或多或少都会应用一些避免 NPE 的方式,所以才不需要 Optional,这都只是权衡罢了。
deepreader
2021-01-27 09:40:23 +08:00
建议楼主入门一下 monad
ychost
2021-01-27 20:09:28 +08:00
还行吧和 stream 一起来舒服多了
Optional.ofNullable(records)
.filter(v -> v.size() > 0)
.map(Collection::stream)
.orElseGet(Stream::empty)
.filter(Objects::nonNull)
.map(v -> v.get(column))
.filter(Objects::nonNull)
.map(String::valueOf)
.findFirst()
.orElse(null);

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

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

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

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

© 2021 V2EX