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

JAVA8 的 Optional 是鸡肋

  •  
  •   mightofcode · 2021-01-25 15:00:29 +08:00 · 12485 次点击
    这是一个创建于 1179 天前的主题,其中的信息可能已经有所发展或是发生改变。
    对于处理 NPE 问题基本没有帮助

    不使用 Optional,你得判空
    使用 Optional,你还是得判空,只是换了一种形式
    引入 Optional 降低代码可读性,代码变得丑陋

    我在工作中从没见到有项目使用 Optional
    除了使用 java stream 不得不用到 Optional

    本质上 java 要在 null 上做优化只能通过底层语言设计上做改进(比如 Rust ),然而由于兼容性的需要,这条路已经走不通了
    第 1 条附言  ·  2021-01-25 18:00:21 +08:00
    1,Optional 会有个警告提示你判空,但是这个只是警告,是非强制的

    2,没有 Optional 我可以选择判空、不判空,有了 Optional 我还是可以选择判空、不判空,只是多了个警告而已,而且代码还变难读了!

    3,入参用 Optional 还是不用?如果真这么好用,那么入参也应该用用起来啊,但是稍微想想就知道入参绝不适合用 Optional

    Optional 解决了一个无关紧要的小问题,带来的是可读性的下降,真的是鸡肋
    118 条回复    2021-01-27 20:09:28 +08:00
    1  2  
    James369
        101
    James369  
       2021-01-26 13:41:50 +08:00
    非常的好用,我都恨 C++不引入 Optional
    wutiantong
        102
    wutiantong  
       2021-01-26 13:46:54 +08:00
    James369
        103
    James369  
       2021-01-26 13:56:57 +08:00
    @wutiantong 在我看来这只是类层面的曲线救国的实现,没有语法糖来得甜。比如 swift 中的 optional,语言自带,很简洁很爽。
    James369
        104
    James369  
       2021-01-26 13:58:37 +08:00
    @wutiantong kotlin/swift 才是真正的爽,c++/java 都是后天弥补。
    yazinnnn
        105
    yazinnnn  
       2021-01-26 14:10:12 +08:00
    不如一步到胃引入 either ,变得更函数式一些
    wutiantong
        106
    wutiantong  
       2021-01-26 14:10:50 +08:00
    @James369 曾经也写过 swift,链式的?和??的设计确实不错。但代码中过多的感叹号和问号真的会影响观感和可读性。

    究其根源在于他们的标准库从上一代( Obj-C,Java )一脉相承,里面难免带入了很多 nullable 语义,导致实际代码中 optional 类型极度泛滥。

    反观现代 C++,在最佳实践中大部分类型都遵循值语义,天然是非空的,所以根本就不需要考虑 optional 操作,只有在你需要 optional 语义的地方才会引入 optional 类型。所以可读性方面反而明显更佳。
    tairan2006
        107
    tairan2006  
       2021-01-26 14:17:35 +08:00
    Rust 最好,强制你用…swift 那种也挺好,比较方便…

    Java 这个只能在链式操作上用,就一般般了…

    而且用 ide 写 if(x != null)并不是很麻烦,Golang 还一步一检查 if err != nil 呢…
    djFFFFF
        108
    djFFFFF  
       2021-01-26 14:27:10 +08:00
    用过 Scala 的 Option 之后,确实觉得 Java 的 Optional 有点鸡肋。
    hahasong
        109
    hahasong  
       2021-01-26 14:57:01 +08:00
    Optional 不是 swift 里的么,理想很美好,搬过来没那味了
    psyche
        110
    psyche  
       2021-01-26 17:53:20 +08:00
    我们项目里面就用了很多 Optional,如果下属返回个 null == Optional,第一次可以教,屡教不改的叫他滚就行。如果是隔壁合作的项目组,我自己没权限开人,可以要求上司换人合作,他不走我走呗。
    楼主所在的项目组很难招到靠谱的人吗?如果是的话建议跳槽。
    人生苦短,为这些事情烦恼挺无聊的。
    yannxia
        111
    yannxia  
       2021-01-26 18:07:51 +08:00
    用 Optional == null 都算是没什么必要的改造,Option.fromNullable(xxx).map().map().map().else() 才需要
    ztcaoll222
        112
    ztcaoll222  
       2021-01-26 18:18:49 +08:00 via Android
    能做到明明返回是 optional 结果还要调用的人判断是否为 null 的人不赶紧开了留着害人?
    chocotan
        113
    chocotan  
       2021-01-26 18:21:15 +08:00
    “我在工作中从没见到有项目使用 Optional
    除了使用 java stream 不得不用到 Optional”
    我在工作中见到很多项目使用 Optional
    除了使用 java stream 外,很多地方都在用 Optional
    James369
        114
    James369  
       2021-01-26 21:07:02 +08:00
    @wutiantong swift 的链式写法,as?类型转换,try?尝试等等,真的节省很多冗余代码。我觉得真的爽。
    zeni123
        115
    zeni123  
       2021-01-26 21:41:56 +08:00 via iPhone
    Optional 还是挺好用的 代表了另一种编程思想 可能楼主不习惯 不是一定要用不可
    by73
        116
    by73  
       2021-01-26 22:10:04 +08:00
    这不是优化吧,只是单纯的想解决 NPE 问题,只是 Java 提供的方案有点不太好看罢了。如果用 IDEA 的话,可以用一些 @Notnull 注解让 IDEA 帮你稍微看一眼(好像是这个)。

    实际上这种东西都是希望帮你在编译期解决一些潜在的问题罢了,像 Optional,万一哪个地方就是忘了进行判断呢? Rust 诞生基本也是这种思路,只是更加强制。不过 Optional 总体思路是好的,只是在 Java 上是有点“啰嗦”,我猜你工作中应该或多或少都会应用一些避免 NPE 的方式,所以才不需要 Optional,这都只是权衡罢了。
    deepreader
        117
    deepreader  
       2021-01-27 09:40:23 +08:00
    建议楼主入门一下 monad
    ychost
        118
    ychost  
       2021-01-27 20:09:28 +08:00
    还行吧和 stream 一起来舒服多了
    Optional.ofNullable(records)
    .filter(v -> v.size() > 0)
    .map(Collection::stream)
    .orElseGet(Stream::empty)
    .filter(Objects::nonNull)
    .map(v -> v.get(column))
    .filter(Objects::nonNull)
    .map(String::valueOf)
    .findFirst()
    .orElse(null);
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5543 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 03:25 · PVG 11:25 · LAX 20:25 · JFK 23:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.