Java8 Optional 怎么用

2020-04-10 15:56:01 +08:00
 sandman511
Optional<Map<String, Object>> studentMapOpt = 
	studentList.stream().filter(x -> x.get("gender").equals("male")).findFirst();

if (studentMapOpt.isPresent()) {
	String studentName = studentMapOpt.get().get("studentName").toString();
    	......
    	......
}

我这样用感觉怪怪的,跟 if else 没啥区别啊...
请教下大家正确用法是怎么用的
我在不同时期一共看过 Optional 的用法了...就是理解不了...

2981 次点击
所在节点    程序员
21 条回复
mazai
2020-04-10 15:57:59 +08:00
可以用函数表达式写而已,主要就是为了防止空指针增加一些其他操作
sandman511
2020-04-10 15:58:37 +08:00
我就想随便找个男性学生 类似这种需求也不能 orElse()
chendy
2020-04-10 16:00:31 +08:00
挺尴尬的东西,好处是可以挂回调,一路点点点下去
没有这方面需求或者习惯的话还不如自己判断
zhazi
2020-04-10 16:01:00 +08:00
optional 是解决空指针的 你用 steam 直接拿出 studentName 如果是 null 值直接处理就可以了
student.filter().findFirst(). map(std-> std. name). orElse(默认值)
hujianxin
2020-04-10 16:02:17 +08:00
一个重要作用就是,通过接口来规范程序员的编程。

比如,已经设计好了 Optional 相关返回值的接口,实现类的人就需要更仔细的思考返回空值的问题,更重要的是,调用这个方法的人就会仔细思考返回值如果是空值时怎么做,而不会因为忽略这个问题到成无法挽回的 bug
ilumer
2020-04-10 16:56:39 +08:00
你要是想获取深层次的 a->b->d 的属性这个时候就舒服很多
jatesun
2020-04-10 17:00:24 +08:00
强制调用者处理 null 值的情况
xuxuzhaozhao
2020-04-10 17:02:27 +08:00
你要是用过 linq,处理过很繁杂的顺序调用,你就晓得这个东西熟悉后用起来是多么的爽。
Takamine
2020-04-10 17:03:33 +08:00
用 isPresident 确实没啥区别。
一般会结合 orElse 和 orElseGet 吧。
zhuangzhuang1988
2020-04-10 17:27:21 +08:00
试试 scala 的 optional
zhuangzhuang1988
2020-04-10 17:27:52 +08:00
scala 的 Option
https://www.scala-lang.org/api/current/scala/Option.html
```scala
val upper = for {
name <- request getParameter "name"
trimmed <- Some(name.trim)
upper <- Some(trimmed.toUpperCase) if trimmed.length != 0
} yield upper
println(upper getOrElse "")
```
vincenteof
2020-04-10 17:43:18 +08:00
比直接 null 稍微好点,可以在在类型系统上稍微约束下程序员的思维,但没有 do-annotation 的话复杂点的场景会把代码搞得居难看
Samuelcc
2020-04-10 19:47:37 +08:00
用 isPresent 的话没什么区别,一般都是结合 orElse, orElseGet, orElseThrow 以及 map 用。
最好用的时候是需要对连续几个函数结果进行 nullcheck 的情况。
scriptB0y
2020-04-10 19:52:41 +08:00
Optional 就是让 null 的处理更有语义,并且强制要求判断 null 而已。比如你的接口声明返回 optional,那调用方就必须去处理 null 的情况。

oracle 这篇看完就全懂了:
https://www.oracle.com/technical-resources/articles/java/java8-optional.html
RRRSSS
2020-04-10 20:32:43 +08:00
String v = Optional.ofNullable(val).orElse('default value')
oneisall8955
2020-04-10 20:40:47 +08:00
studentList.stream().filter(x -> x.get("gender").equals("male")).findFirst() // 获取第一个 studMap 的 Optional

.map(stu->stu.get("studentName")) // 转换得到存储 studentName 的 Optional

.orElse(null) // 安全的获取,如果没有则使用默认值 null
guyeu
2020-04-10 20:42:30 +08:00
一般作为方法的返回值,显式告诉方法的用户这个方法的返回值可能是空。
araaaa
2020-04-10 20:58:31 +08:00
可以去了解下 Option Try Either 的作用
araaaa
2020-04-10 21:01:17 +08:00
@araaaa #18 都是函数式范畴的东西,写工程的话为了普遍可读可用可不用
ConradG
2020-04-11 04:54:57 +08:00
一般不是因为类型丢失的问题而不推荐参数和返回值使用 Optional 的吗

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

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

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

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

© 2021 V2EX