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 的用法了...就是理解不了...
1
mazai 2020-04-10 15:57:59 +08:00
可以用函数表达式写而已,主要就是为了防止空指针增加一些其他操作
|
2
sandman511 OP 我就想随便找个男性学生 类似这种需求也不能 orElse()
|
3
chendy 2020-04-10 16:00:31 +08:00
挺尴尬的东西,好处是可以挂回调,一路点点点下去
没有这方面需求或者习惯的话还不如自己判断 |
4
zhazi 2020-04-10 16:01:00 +08:00 via Android 1
optional 是解决空指针的 你用 steam 直接拿出 studentName 如果是 null 值直接处理就可以了
student.filter().findFirst(). map(std-> std. name). orElse(默认值) |
5
hujianxin 2020-04-10 16:02:17 +08:00 2
一个重要作用就是,通过接口来规范程序员的编程。
比如,已经设计好了 Optional 相关返回值的接口,实现类的人就需要更仔细的思考返回空值的问题,更重要的是,调用这个方法的人就会仔细思考返回值如果是空值时怎么做,而不会因为忽略这个问题到成无法挽回的 bug |
6
ilumer 2020-04-10 16:56:39 +08:00
你要是想获取深层次的 a->b->d 的属性这个时候就舒服很多
|
7
jatesun 2020-04-10 17:00:24 +08:00
强制调用者处理 null 值的情况
|
8
xuxuzhaozhao 2020-04-10 17:02:27 +08:00
你要是用过 linq,处理过很繁杂的顺序调用,你就晓得这个东西熟悉后用起来是多么的爽。
|
9
Takamine 2020-04-10 17:03:33 +08:00 via Android
用 isPresident 确实没啥区别。
一般会结合 orElse 和 orElseGet 吧。 |
10
zhuangzhuang1988 2020-04-10 17:27:21 +08:00
试试 scala 的 optional
|
11
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 "") ``` |
12
vincenteof 2020-04-10 17:43:18 +08:00
比直接 null 稍微好点,可以在在类型系统上稍微约束下程序员的思维,但没有 do-annotation 的话复杂点的场景会把代码搞得居难看
|
13
Samuelcc 2020-04-10 19:47:37 +08:00 via Android
用 isPresent 的话没什么区别,一般都是结合 orElse, orElseGet, orElseThrow 以及 map 用。
最好用的时候是需要对连续几个函数结果进行 nullcheck 的情况。 |
14
scriptB0y 2020-04-10 19:52:41 +08:00 1
Optional 就是让 null 的处理更有语义,并且强制要求判断 null 而已。比如你的接口声明返回 optional,那调用方就必须去处理 null 的情况。
oracle 这篇看完就全懂了: https://www.oracle.com/technical-resources/articles/java/java8-optional.html |
15
RRRSSS 2020-04-10 20:32:43 +08:00
String v = Optional.ofNullable(val).orElse('default value')
|
16
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 |
17
guyeu 2020-04-10 20:42:30 +08:00
一般作为方法的返回值,显式告诉方法的用户这个方法的返回值可能是空。
|
18
araaaa 2020-04-10 20:58:31 +08:00 via iPhone
可以去了解下 Option Try Either 的作用
|
20
ConradG 2020-04-11 04:54:57 +08:00
一般不是因为类型丢失的问题而不推荐参数和返回值使用 Optional 的吗
|
21
acr0ss 2020-04-11 10:19:13 +08:00
Optional/Stream 主要是为了可读性。
如果代码中分支流程( if/else )越多,那么理解起来就越困难,换言之可读性差。 而使用 Optional/Stream,可以规避 if/else 的判断(楼上多人都给出了写法)。这会使代码的整体结构,看着就像多个函数组成的一个过程,便于理解代码的主要逻辑。 如果说 if/else 的分支判断理解为流程图,那么 Optional/Stream 写法是将流程图的**主线流程**提取出来,提高可读性。 |