V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sandman511
V2EX  ›  程序员

Java8 Optional 怎么用

  •  
  •   sandman511 · 2020-04-10 15:56:01 +08:00 · 3171 次点击
    这是一个创建于 1667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 的用法了...就是理解不了...

    21 条回复    2020-04-11 10:19:13 +08:00
    mazai
        1
    mazai  
       2020-04-10 15:57:59 +08:00
    可以用函数表达式写而已,主要就是为了防止空指针增加一些其他操作
    sandman511
        2
    sandman511  
    OP
       2020-04-10 15:58:37 +08:00
    我就想随便找个男性学生 类似这种需求也不能 orElse()
    chendy
        3
    chendy  
       2020-04-10 16:00:31 +08:00
    挺尴尬的东西,好处是可以挂回调,一路点点点下去
    没有这方面需求或者习惯的话还不如自己判断
    zhazi
        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(默认值)
    hujianxin
        5
    hujianxin  
       2020-04-10 16:02:17 +08:00   ❤️ 2
    一个重要作用就是,通过接口来规范程序员的编程。

    比如,已经设计好了 Optional 相关返回值的接口,实现类的人就需要更仔细的思考返回空值的问题,更重要的是,调用这个方法的人就会仔细思考返回值如果是空值时怎么做,而不会因为忽略这个问题到成无法挽回的 bug
    ilumer
        6
    ilumer  
       2020-04-10 16:56:39 +08:00
    你要是想获取深层次的 a->b->d 的属性这个时候就舒服很多
    jatesun
        7
    jatesun  
       2020-04-10 17:00:24 +08:00
    强制调用者处理 null 值的情况
    xuxuzhaozhao
        8
    xuxuzhaozhao  
       2020-04-10 17:02:27 +08:00
    你要是用过 linq,处理过很繁杂的顺序调用,你就晓得这个东西熟悉后用起来是多么的爽。
    Takamine
        9
    Takamine  
       2020-04-10 17:03:33 +08:00 via Android
    用 isPresident 确实没啥区别。
    一般会结合 orElse 和 orElseGet 吧。
    zhuangzhuang1988
        10
    zhuangzhuang1988  
       2020-04-10 17:27:21 +08:00
    试试 scala 的 optional
    zhuangzhuang1988
        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 "")
    ```
    vincenteof
        12
    vincenteof  
       2020-04-10 17:43:18 +08:00
    比直接 null 稍微好点,可以在在类型系统上稍微约束下程序员的思维,但没有 do-annotation 的话复杂点的场景会把代码搞得居难看
    Samuelcc
        13
    Samuelcc  
       2020-04-10 19:47:37 +08:00 via Android
    用 isPresent 的话没什么区别,一般都是结合 orElse, orElseGet, orElseThrow 以及 map 用。
    最好用的时候是需要对连续几个函数结果进行 nullcheck 的情况。
    scriptB0y
        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
    RRRSSS
        15
    RRRSSS  
       2020-04-10 20:32:43 +08:00
    String v = Optional.ofNullable(val).orElse('default value')
    oneisall8955
        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
    guyeu
        17
    guyeu  
       2020-04-10 20:42:30 +08:00
    一般作为方法的返回值,显式告诉方法的用户这个方法的返回值可能是空。
    araaaa
        18
    araaaa  
       2020-04-10 20:58:31 +08:00 via iPhone
    可以去了解下 Option Try Either 的作用
    araaaa
        19
    araaaa  
       2020-04-10 21:01:17 +08:00 via iPhone
    @araaaa #18 都是函数式范畴的东西,写工程的话为了普遍可读可用可不用
    ConradG
        20
    ConradG  
       2020-04-11 04:54:57 +08:00
    一般不是因为类型丢失的问题而不推荐参数和返回值使用 Optional 的吗
    acr0ss
        21
    acr0ss  
       2020-04-11 10:19:13 +08:00
    Optional/Stream 主要是为了可读性。
    如果代码中分支流程( if/else )越多,那么理解起来就越困难,换言之可读性差。
    而使用 Optional/Stream,可以规避 if/else 的判断(楼上多人都给出了写法)。这会使代码的整体结构,看着就像多个函数组成的一个过程,便于理解代码的主要逻辑。

    如果说 if/else 的分支判断理解为流程图,那么 Optional/Stream 写法是将流程图的**主线流程**提取出来,提高可读性。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2494 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 10:34 · PVG 18:34 · LAX 03:34 · JFK 06:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.