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 ![]() optional 是解决空指针的 你用 steam 直接拿出 studentName 如果是 null 值直接处理就可以了 student.filter().findFirst(). map(std-> std. name). orElse(默认值) |
![]() | 5 hujianxin 2020-04-10 16:02:17 +08:00 ![]() 一个重要作用就是,通过接口来规范程序员的编程。 比如,已经设计好了 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 ![]() 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 itechify PRO 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 写法是将流程图的**主线流程**提取出来,提高可读性。 |