官方说是用于防止空指针的。
1.如果类的某个字段是 Optional,那就意味着 Nullable,会强制做 isPresent()判断是否为空
2.如果方法返回类型是 Optional,那就意味着 Nullable,也需要做 isPresent()判断是否为空
实际使用中,感觉对原有的返回类型,字段类型改动很大,所以没咋用。
同事却把这个 Optional 当成了炫技的手段。
一个为空的判断,只要 object == null 就可以;
同事却一直使用
!Optional.ofNullable(object).isPresent()
同理非空判断是
Optional.ofNullable(object).isPresent()
哎呦我去,这个绕。
---吐槽します---
1
6IbA2bj5ip3tK49j 2017-09-30 10:05:41 +08:00
一个不做判断 null,IDE 会提示。
一个不做没有任何影响。 区别在这儿吧。 kotlin 解决这个问题更优雅。 |
2
gongzhang 2017-09-30 10:07:44 +08:00 1
|
4
gcli 2017-09-30 10:11:47 +08:00 2
|
5
microhz 2017-09-30 10:12:27 +08:00
连续做非空判断还是有简介的,可以减少 if 嵌套
|
6
QAPTEAWH 2017-09-30 10:16:28 +08:00
- Optional 是代替空指针的,该空的东西还是会空
- Optional 只能避免反复的 if (xxx != null), 不能避免 NullPointerException - 正确用法是多用 .map, .orElse, 如果你处处在用.isPresent, 还不如用老办法 |
7
QAPTEAWH 2017-09-30 10:19:57 +08:00
- 空指针是“在类型系统上开了个洞”
|
8
kenken 2017-09-30 10:22:05 +08:00 via iPhone
map filter ifpresent orelse
|
9
huangchang250 2017-09-30 10:25:00 +08:00
应该吐槽的是你的同事
|
10
BoiledEgg 2017-09-30 10:25:35 +08:00 1
你同事滥用的问题
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 嵌套要舒服。 |
11
chocotan 2017-09-30 10:33:02 +08:00 6
楼上们说的挺清楚了,我贴个书上的简单的栗子
|
12
mgcnrx11 2017-09-30 10:59:37 +08:00 1
|
13
zhx1991 2017-09-30 11:00:07 +08:00
object == null 的判断会被忘记
|
14
0915240 2017-09-30 11:16:40 +08:00 via iPhone
就是提醒处理 null 算是一种约束吧。
之前 guava 里面好像也是这么解释的。 另 orelse 之类针对 if null then default value 蛮好的。 |
15
incompatible 2017-09-30 11:27:53 +08:00
“实际使用中,感觉对原有的返回类型,字段类型改动很大,所以没咋用。"
这就是你的问题了。 如果你肯把方法的返回值写成 Optional,那么你同事也不用费劲地写 Optional.ofNullable()了 |
16
svenFeng 2017-09-30 11:41:24 +08:00 via Android
这东西得有模式匹配才能发挥真正的作用,直接在编译器杜绝空指针,参见 rust/haskell,而 Java 的话,这东西当作要判断空指针的标识就可以了
|
17
lihongjie0209 2017-09-30 11:45:51 +08:00
map 或者是 ifPresent, 上面这种用法是官方不推荐的, 因为这么用和用 null 没区别
|
18
lihongjie0209 2017-09-30 11:46:56 +08:00 4
具体内容可以看这个: &t=25s
|
19
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 。 |
21
teek 2017-09-30 14:13:12 +08:00
|
22
honeycomb 2017-09-30 14:19:27 +08:00
|
23
pynix 2017-09-30 14:27:03 +08:00
哈哈哈
|
26
acr0ss OP @huangchang250 you got it
|
28
misaka19000 2017-09-30 16:45:33 +08:00 via Android
不应该用 shi mashida 嘛。。。
|
29
acr0ss OP @misaka19000 给各位日语大佬递茶
|
30
crash 2017-09-30 18:17:27 +08:00
用过 swift 的表示,optional 没楼上那么复杂。使用 optional 并不需要知道 RX 系列。
|
31
hantsy 2017-10-01 12:04:12 +08:00
@acr0ss 常常忍不住一些看法,谅解。
RxJava `Maybe` 和 Reactor `Mono` 才是 Optional 想要变成的样子,只是 Java Optional 生的太早。Java 9 Flow API 直接 Copy 了 ReactiveSteams JVM 的 API,提供了一个简单的实现。 |
32
troywinter 2017-10-07 11:43:13 +08:00
从 optional 扯到 stream 和 rx 也是醉了,你们要不要继续扯扯 monad。。。
|