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

随着 pattern matching 接连增强了好几个版本,现在连 Java 官方都在推 Data Oriented Programming 和 ADT 建模了。。函数式编程真是领先业界 50 年

  •  
  •   TWorldIsNButThis · 2022-07-14 22:19:19 +08:00 · 3015 次点击
    这是一个创建于 845 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Algebraic data types were introduced in Hope, a small functional programming language developed in the 1970s at the University of Edinburgh

    另外提一嘴,现在 java 的官方示例里都是能 var 都 var 的

    最后的示例直接不装了,大大方方得承认 pattern matching is clearly more concise than vistors, but it's also more flexible and powerful.

    不知多少年后国内的八股文会开始问 DOP ?

    还有一篇 Java 语言的 project lead Brian Goetz 的文章
    https://www.infoq.com/articles/data-oriented-programming-java/
    22 条回复    2022-07-21 22:13:46 +08:00
    hingbong
        1
    hingbong  
       2022-07-14 22:45:11 +08:00 via Android
    学 rust 的时候,最想要的就是这个,kotlin 想了很多办法也没能实现类似的东西,这个真好啊
    TWorldIsNButThis
        2
    TWorldIsNButThis  
    OP
       2022-07-14 22:50:05 +08:00
    @hingbong kotlin 主要是 when 比较残废,没有解构声明的功能,sealed class 倒是很早就有了
    Cbdy
        3
    Cbdy  
       2022-07-14 23:00:14 +08:00 via Android
    很合理
    luob
        4
    luob  
       2022-07-15 04:23:24 +08:00
    不是所有程序员都跟前端一样天天盯着标准看今年更新了什么语法,尤其是 javaer

    不过 javaer 也不用灰心,今年或明年可能会有某个重量级选手把 ADT 炒到 能让你不懂技术的老板都来过问一下你们的业务语言支不支持完整的 ADT 和 pattern match 的地步,开个玩笑(
    chendy
        5
    chendy  
       2022-07-15 07:52:19 +08:00
    说到 var ,多年前曾经在项目里大规模使用过 lombok 的 val
    结果就是吧,看自己的代码还好,看别人写的就经常要点一下方法声明看看返回类型是啥,就有一种“使用方不需要关心类型但是又得知道啥类型”的感觉。优不优雅不好说,确实多了点麻烦
    kilasuelika
        6
    kilasuelika  
       2022-07-15 08:24:33 +08:00 via Android
    DOP 跟函数式编程没有必然的联系。

    我以前在 Mathematica 上用过函数式编程。感觉就是写起来爽,但性能不太行,占用的内存也高,这个也很容易理解,函数式编程推崇不可变数据,必然要用额外的空间存储。debug 也有点难,有时候 map 一下,出错了也不知道是在哪个输入上出错。

    被折磨了一段时间后就不用了。
    me221
        7
    me221  
       2022-07-15 08:58:22 +08:00
    @chendy 说实话 非常讨厌 var.
    Mithril
        8
    Mithril  
       2022-07-15 09:06:54 +08:00
    建议看看这个帖子 https://v2ex.com/t/865425 里面的 Javaer 都是怎么说的。。。
    随便你怎么吹出花来,坚持 Version 8 一百年不动摇。
    TWorldIsNButThis
        9
    TWorldIsNButThis  
    OP
       2022-07-15 09:42:03 +08:00 via iPhone
    @kilasuelika Mathematica 不是静态类型的语言
    @chendy ide 的 inlay hint 不开吗
    @Mithril 这个升不升,其实国内这些程序员的话语分量是最少的,springboot3 出来以后 2 不会维护很长时间
    chendy
        10
    chendy  
       2022-07-15 10:44:09 +08:00
    @TWorldIsNButThis 开 hint 还不如直接吧类型写上……
    clcy1243
        11
    clcy1243  
       2022-07-15 11:35:23 +08:00 via iPhone
    这就是我为什么不愿意做 java ,从 19 年应公司要求转组之后开始接触 java ,发现越是老 java ,越不愿意走出自己的舒适圈,语言、框架、组件的新版本新特性都不去看不去学,也不去看新出的组件和框架,一直抱着自己老旧的工具类自以为高效通用还洋洋得意,却不知道自己即将被时代抛弃。

    我从最开始接触 java ,就找怎么减少繁杂且无用的工作,开始用 lombok 的注解和 var val ,开始用 localdatetime ,开始用 stream ,为了迁就公司的 mybatis 技术栈开始是自己写 generator 配置,然后自己做插件,再之后学习 mybatis-dynamic-sql 组件,反观老 java ,19 年和现在毫无变化,每次提新的东西就是学习成本以及老项目,从来不说能提升多少效率。

    我唯一能想到的他们不愿意学的原因就是学习耽误摸鱼,而且用新东西不能复制老代码,出了错自己没见过不知道怎么查,对这种人就很厌烦,不愿意学习做什么技术,所有的技术工种都是要持续学习持续进步的,因为技术在不断发展,你不进步就只能停留在这个时代,运气好转了管理可能还能继续工作,运气不好被裁了就再也进不去技术岗位。
    aguesuka
        12
    aguesuka  
       2022-07-15 11:36:41 +08:00
    undecidable 的 adt 没有灵魂.

    @kilasuelika 下一个 10 年, 函数式编程中的性能问题"有望"通过 Cost-Aware Type Theory 这样的东西(但不是 CATT 本身)解决.
    @TWorldIsNButThis kotlin 的 sealed class 之前也是个残废, 因为 jdk 的原因只支持抽象类不支持接口, 而且好像 jetbrains 不把它挡回事.
    TWorldIsNButThis
        13
    TWorldIsNButThis  
    OP
       2022-07-15 14:53:37 +08:00
    @aguesuka 当时 java 引入了 sealed 以后 kotlin 好像跟着就出 sealed interface 了
    kotlin 的饼画的太大,感觉人手不是很够用的样子
    cs419
        14
    cs419  
       2022-07-15 15:40:29 +08:00
    类型匹配 解构 scala 中就有
    先是 scala 语法比较激进 上手难度大
    后来出了 kotlin 语法糖相较 java 与 scala 算是个折中
    partystart
        15
    partystart  
       2022-07-15 17:43:34 +08:00
    我是真的不理解使用 var 的意义是什么?

    从看代码的角度 ,基本上都是从左到右扫描

    用 var 的话 我还需要看到右边的代码.

    尤其是看到

    for (var item: list) {
    out.prinltn("name:" + item)
    }

    看到这种就操蛋了, 我还需要去查看 lis 里面 item 是什么类型


    脱裤子放屁?
    jameslan
        16
    jameslan  
       2022-07-16 05:28:20 +08:00 via iPad
    @partystart 您这 list 的命名也是没谁了
    huihuimoe
        17
    huihuimoe  
       2022-07-18 04:54:00 +08:00
    @partystart 我也真的不理解为什么不使用 var 。

    首先正常人不会写出这样的代码,写出这样代码的 CR 直接就被批了好吗?
    正常的代码应该变量名是能体现其作用的。

    再者

    // for (Person person: personList) {
    for (var person: personList) {
    log.info("person: {}", person);
    }

    您看这样的代码,按您的说法,写 Person person ,从左到右扫描,读了两次 person ,表明 person 是个 person ,那不就是脱裤子放屁吗?
    partystart
        18
    partystart  
       2022-07-18 10:01:20 +08:00
    @huihuimoe

    1. for (Person person: personList) 循环 list ,看左边的类型不就可以知道 list 里面的类型了 。从左到右为啥要读两次?
    2. for (var person: personList) 如果你需要了解 list 里面的元素是什么类型 你怎么办 ?操纵光标放 list 上? command + click 点击?
    3. 字段名只代表它叫什么,不代表它的类型是什么 ?看到 personList 这个名字就代表 Person ?
    aguesuka
        19
    aguesuka  
       2022-07-20 15:33:07 +08:00
    @partystart eclipse 没有 type hints 吗? 为什么用 var 的原因很简单, 因为显式的类型声明在语法树上是有副作用的:
    ```
    Object wrap = new Object(){

    }
    ```
    aguesuka
        20
    aguesuka  
       2022-07-20 15:37:09 +08:00
    上段没打完发了,
    ```
    Object wrap = new Object(){
    int value = 0
    }
    ```
    如果是 var 的话那么可以 wrap.value. 当然很多时候我们不需要这个特性, 这里只是展示一下这个副作用, 这种副作用应该是要尽量避免的.
    ychost
        21
    ychost  
       2022-07-21 22:13:01 +08:00
    @partystart 别老盯着 Java ,建议看下 C#/Node/PHP 等等,起始像 C# 我认为就设计的挺优秀的,里面清一色的 var ,一般看代码都是有 IDE 的,IDE 会直接显示 var 的类型是什么,尤其是 Java 里面用到多个类型推导的时候,不写 var 还真不知道返回该怎么写,比如设计到泛型之间有关联,然后返回又是与其它泛型关联的情况
    ychost
        22
    ychost  
       2022-07-21 22:13:46 +08:00
    @ychost 尤其看 Typescript 的的 VUE 等源码,里面的泛型约束真实及其复杂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2637 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 15:36 · PVG 23:36 · LAX 07:36 · JFK 10:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.