101
James369 2021-01-26 13:41:50 +08:00
非常的好用,我都恨 C++不引入 Optional
|
102
wutiantong 2021-01-26 13:46:54 +08:00
@James369 C++有 optional 呀( https://en.cppreference.com/w/cpp/utility/optional )
|
103
James369 2021-01-26 13:56:57 +08:00
@wutiantong 在我看来这只是类层面的曲线救国的实现,没有语法糖来得甜。比如 swift 中的 optional,语言自带,很简洁很爽。
|
104
James369 2021-01-26 13:58:37 +08:00
@wutiantong kotlin/swift 才是真正的爽,c++/java 都是后天弥补。
|
105
yazinnnn 2021-01-26 14:10:12 +08:00
不如一步到胃引入 either ,变得更函数式一些
|
106
wutiantong 2021-01-26 14:10:50 +08:00
@James369 曾经也写过 swift,链式的?和??的设计确实不错。但代码中过多的感叹号和问号真的会影响观感和可读性。
究其根源在于他们的标准库从上一代( Obj-C,Java )一脉相承,里面难免带入了很多 nullable 语义,导致实际代码中 optional 类型极度泛滥。 反观现代 C++,在最佳实践中大部分类型都遵循值语义,天然是非空的,所以根本就不需要考虑 optional 操作,只有在你需要 optional 语义的地方才会引入 optional 类型。所以可读性方面反而明显更佳。 |
107
tairan2006 2021-01-26 14:17:35 +08:00
Rust 最好,强制你用…swift 那种也挺好,比较方便…
Java 这个只能在链式操作上用,就一般般了… 而且用 ide 写 if(x != null)并不是很麻烦,Golang 还一步一检查 if err != nil 呢… |
108
djFFFFF 2021-01-26 14:27:10 +08:00
用过 Scala 的 Option 之后,确实觉得 Java 的 Optional 有点鸡肋。
|
109
hahasong 2021-01-26 14:57:01 +08:00
Optional 不是 swift 里的么,理想很美好,搬过来没那味了
|
110
psyche 2021-01-26 17:53:20 +08:00
我们项目里面就用了很多 Optional,如果下属返回个 null == Optional,第一次可以教,屡教不改的叫他滚就行。如果是隔壁合作的项目组,我自己没权限开人,可以要求上司换人合作,他不走我走呗。
楼主所在的项目组很难招到靠谱的人吗?如果是的话建议跳槽。 人生苦短,为这些事情烦恼挺无聊的。 |
111
yannxia 2021-01-26 18:07:51 +08:00
用 Optional == null 都算是没什么必要的改造,Option.fromNullable(xxx).map().map().map().else() 才需要
|
112
ztcaoll222 2021-01-26 18:18:49 +08:00 via Android
能做到明明返回是 optional 结果还要调用的人判断是否为 null 的人不赶紧开了留着害人?
|
113
chocotan 2021-01-26 18:21:15 +08:00
“我在工作中从没见到有项目使用 Optional
除了使用 java stream 不得不用到 Optional” 我在工作中见到很多项目使用 Optional 除了使用 java stream 外,很多地方都在用 Optional |
114
James369 2021-01-26 21:07:02 +08:00
@wutiantong swift 的链式写法,as?类型转换,try?尝试等等,真的节省很多冗余代码。我觉得真的爽。
|
115
zeni123 2021-01-26 21:41:56 +08:00 via iPhone
Optional 还是挺好用的 代表了另一种编程思想 可能楼主不习惯 不是一定要用不可
|
116
by73 2021-01-26 22:10:04 +08:00
这不是优化吧,只是单纯的想解决 NPE 问题,只是 Java 提供的方案有点不太好看罢了。如果用 IDEA 的话,可以用一些 @Notnull 注解让 IDEA 帮你稍微看一眼(好像是这个)。
实际上这种东西都是希望帮你在编译期解决一些潜在的问题罢了,像 Optional,万一哪个地方就是忘了进行判断呢? Rust 诞生基本也是这种思路,只是更加强制。不过 Optional 总体思路是好的,只是在 Java 上是有点“啰嗦”,我猜你工作中应该或多或少都会应用一些避免 NPE 的方式,所以才不需要 Optional,这都只是权衡罢了。 |
117
deepreader 2021-01-27 09:40:23 +08:00
建议楼主入门一下 monad
|
118
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); |