JAVA8 的 Optional 是鸡肋

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

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

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

本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
13014 次点击
所在节点    Java
118 条回复
Jooooooooo
2021-01-25 15:01:32 +08:00
optional 强制判空, 还是有点用的
finab
2021-01-25 15:03:00 +08:00
习惯就还挺好的,optional 用习惯了后,发现挺舒服的,现在写没有 optional 特性的语言代码时都有点不习惯了
Jirajine
2021-01-25 15:05:26 +08:00
optional 存在的意义就是通过静态检查强制你处理为空时的情况。rust 也是这样做的。
fishCulturer
2021-01-25 15:05:38 +08:00
感觉判空这块还是工具包香
yuhuan66666
2021-01-25 15:06:46 +08:00
强制判空,怕你忘,对于多人协作开发,返回值加一个,挺好用的,我就喜欢用
sampeng
2021-01-25 15:12:05 +08:00
自己水平不够就认为没用?
感情你工作这么久从来没有或者没见过空指针?
现在从语言层面消灭空指针不都是 optional 的方式么?
guyeu
2021-01-25 15:12:27 +08:00
问好语法糖和 Optional 又有什么本质区别呢?我觉得 Optional 最重要的意义是提高空返回值的成本,促使程序员使用有意义的返回值代替空,只有在空有意义的情况下才返回空,这样一来,现有的绝大多数的判空就不需要写了。
mxT52CRuqR6o5
2021-01-25 15:13:05 +08:00
你这不是 Optional 的问题,而是没有类似 Kotlin 中 Safe Calls 运算符的问题
sampeng
2021-01-25 15:14:13 +08:00
rust 哪门子的底层语言设计上做的改进。本质上 rust 的 Option 和 Optional 的实现有任何区别不成?只是 java 有历史包袱不能让你强制所有地方都用 optional 或者具体的值。rust 没这个负担,所以可以提供?的语法糖。在没有?语法糖的时候 rust 判断 option 也是写的很恶心的
huifer
2021-01-25 15:17:46 +08:00
private static Optional optional(){
return null;
}

public static void main(String[] args) {

System.out.println(optional().isPresent());

}

使用的时候是否要对 `Optional` 判空呢?
yuanxiaosong
2021-01-25 15:19:30 +08:00
随便百度了一个例子,可以试试改成不用 Optional 需要多少代码,少用 isPresent 和 get,多使用 map 、filter 、orElse,多使用 Function 、Supplier 和 Consumer 来解决问题:

Optional
.ofNullable(someVariable)
.map(this::findOtherObject)
.filter(this::isThisOtherObjectStale)
.map(this::convertToJson)
.map(String::trim)
.orElseThrow(() -> new RuntimeException("something went horribly wrong."));

代码来源: https://www.jdon.com/52008
11wangyaoda
2021-01-25 15:24:32 +08:00
optional 最有意思的是 optional 自己有可能是 null
chendy
2021-01-25 15:28:36 +08:00
如果是接 orThrow 直接报错的情况还好
如果是接 orElse(null) 就显得很多余了
yazinnnn
2021-01-25 15:36:09 +08:00
Optional.ofNullable(T value)

用这个啊

如果你调用的 api 的编写人员不靠谱,那就让他别返回 Optional 了
tamer
2021-01-25 15:41:30 +08:00
@yuanxiaosong 这种例子其实很有误导性,
实际业务代码往往并不会简单的是连续的方法引用
LGA1150
2021-01-25 15:50:47 +08:00
@huifer @11wangyaoda 这样写 IDE 会有警告
arloor
2021-01-25 16:00:51 +08:00
给你,你说鸡肋
不给,你说缺失

仔细看看自己写的代码,照样都是 trade off

(点开看,原来不只是黑大 java,还要吹 rust,应该是最喜欢的编程语言评选又开始评选了
xuanbg
2021-01-25 16:04:49 +08:00
很少用,一般都是直接判空。某些场景在实体类的 get 方法中处理值为空。
sakura1
2021-01-25 16:06:16 +08:00
这个问题感觉源自 null 的存在本身
Takamine
2021-01-25 16:07:00 +08:00
建议可以看看《 Java 核心技术卷 2 》 Optional 的部分,比结合 flatMap 使用的。

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

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

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

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

© 2021 V2EX