请教下 java8 的 Optional。。

2020-03-25 00:12:19 +08:00
 javaWeber

最近写了一堆空指针,打算改用下 java8 的 Optional 。。

请问下以下代码,怎么用 Optional 表示。

  1. 判断 A 是否为空,然后修改 B 或者执行其他逻辑。

想过用 if (isPresent())去判空,又觉得跟之前的 if 没什么区别。。

String str="123";
String result="abc";
if(str!=null){
	result+="def";
}

2.判断 A 是否为空,然后根据情况执行 if else 里面的逻辑。。

java9 有个 ifPresentOrElse(),不过项目里用的是 java8 。

String str="123";
String result="abc";
if(str!=null){
	result+="def";
}else {
    result+="ghi";
}
4677 次点击
所在节点    Java
31 条回复
javaWeber
2020-03-25 00:29:16 +08:00
3.还有就是 字符串类型的 Optional.orElse(),这里面 orElse 的默认值用什么好?

我看网上很多用.orElse("default"),为空时就给了个默认值"default"或者"unknown"。。感觉很奇怪。
alphatoad
2020-03-25 00:32:33 +08:00
用 FP 的思路就很好理解了,相当于 Haskell 的 Maybe
data Maybe a = Nothing | Just a
weakish
2020-03-25 00:33:10 +08:00
A 是否为空决定是否对 B 进行操作,这里对 B 的操作并没有用到 A 的值,不会碰到空指针,也就没必要用 Optional 。
weakish
2020-03-25 00:37:50 +08:00
"default" 或者 "unknown" 这是教程里为了演示用的吧。实际场景中,就是应该用什么默认值就用什么默认值呀,原来用 `a == null ? a : "xxx"`,现在改成 `a.orElse("xxx")`,只是写法变一下,并不影响默认值的选取。
bkmi
2020-03-25 00:53:26 +08:00
要不用 kotlin 吧
但是你这两个例子,看不出哪 NPE,就你现在的写法最简单了…
lxychn
2020-03-25 04:32:29 +08:00
不用 optional 的话判断为空的 if 忘了写就可能会出错,用了 optional 的一定要用 ifPresent()去判断,不然 compiler 就会报错,避免忘了检查是否为空的情况

optional 好像和 lamda 结合用的更多
xixinimei
2020-03-25 05:09:01 +08:00
当你意识到一个变量该用 optional 的时候,可以不用 optional 。

Java 的 Optional 表达能力有限,主要是对自由变量的重新赋值很麻烦,需要用到容器类来包装。
optional
2020-03-25 08:01:27 +08:00
Optional 的精髓在 map ifpresent stream
noreplay
2020-03-25 08:05:47 +08:00
@optional 结合 id 来看,特别让人信服🤓🤓
chendy
2020-03-25 08:23:11 +08:00
Optional 的有点是可以挂回调,配合其他(比如 stream ) api 可以一路点点点点写完一套逻辑,但是如果不习惯挂回调的话就很别扭
简单场景单独判断 null 足以
yty2012g
2020-03-25 08:45:02 +08:00
第一,如你图上的示例,确实使用 Optional 和判断是否等于 null 没有区别,因为你的条件分支里面没有使用 str 这个变量。在此情况下,我认为没有区别。
第二,假如你的条件分支有使用 str,那就需要对 str 为 null 的情况赋予其他值,此时可以使用 Optional.orElse("default")或者 Optional.orElseGet(()->"default")这样的方式来代替使用 str 。
第三,还有一种情况是 str 等于 null 我要抛异常,很常见,例如 DB 里面查不到数据我要抛异常,此时可以使用 Optional.orElseThrow(() -> new StrNotFoundException("str 没找到!"))类似的.
综上,不是什么情况下 Optional 都能达到你想要的效果,不过最差的基本面也是和判断是否为 null 类似,所以可以尝试去使用
guyeu
2020-03-25 10:09:01 +08:00
@javaWeber #1 如果不知道用什么好,就用 orThrow,抛出异常。
CommandZi
2020-03-25 10:19:42 +08:00
你这两个例子,不管 str 是不是 null,都不会空指针吧。
Aresxue
2020-03-25 10:35:29 +08:00
optional.ifPresent(修改 B), 但就像上面说的你这个简单调用还不涉及 npe 没必要使用
cyspy
2020-03-25 10:52:24 +08:00
flatmap
mezi04
2020-03-25 11:26:19 +08:00
个人理解:把 optional 想想成盒子,of 或者 ofNullable 传入的参数就是盒子里边的东西。optional 的目的是从这个盒子里拿出一个非空数据,你可以通过一系列的方法转换盒子里的数据( fliter/flatMap ),或者告诉盒子,如果为空怎么做( orElse/ifPresent 等)。如果你的模型不符合这个,就没有用 optional 的必要
hantsy
2020-03-25 13:42:43 +08:00
用 orElseThrow 抛出异常就好了,我也比较常用。
Optional<Post> post = posts.findById(id)

post.map(....).orElseThrow(()->new PostNotFoundException(id))
hantsy
2020-03-25 13:46:49 +08:00
hantsy
2020-03-25 13:48:15 +08:00
Optional 本身就是解决这中 If Null 判断,如果又回到 If 来判断,还不如不用。
hantsy
2020-03-25 13:50:25 +08:00

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

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

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

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

© 2021 V2EX