Java8 Optional 怎么用 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
sandman511
V2EX    程序员

Java8 Optional 怎么用

  •  
  •   sandman511 2020-04-10 15:56:01 +08:00 3627 次点击
    这是一个创建于 2016 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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')
    itechify
        16
    itechify  
    PRO
       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     Solana     2872 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 11:02 PVG 19:02 LAX 04:02 JFK 07:02
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86