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

感觉 java8 和之前的 java 不是一种语言。

  •  
  •   baozijun · 2016-05-15 22:18:49 +08:00 · 8348 次点击
    这是一个创建于 2874 天前的主题,其中的信息可能已经有所发展或是发生改变。
    感觉完全就是 scala 了.....
    第 1 条附言  ·  2016-05-17 09:43:37 +08:00

    追加下《java8实战》原文:

    Java 需要演变

    你之前已经见过了Java的演变。例如,引入泛型,使用List<string>而不只是List,可能 一开始都挺烦人的。但现在你已经熟悉了这种风格和它所带来的好处,即在编译时能发现更多错 误,且代码更易读,因为你现在知道列表里面是什么了。

    其他改变让普通的东西更容易表达,比如,使用for-each循环而不用暴露Iterator里面的 套路写法。Java 8中的主要变化反映了它开始远离常侧重改变现有值的经典面向对象思想,而向 函数式编程领域转变,在大面上考虑做什么(例如,创建一个值代表所有从A到B低于给定价格 的交通线路)被认为是头等大事,并和如何实现(例如,扫描一个数据结构并修改某些元素)区 分开来。请注意,如果极端点儿来说,传统的面向对象编程和函数式可能看起来是冲突的。但是 我们的理念是获得两种编程范式中最好的东西,这样你就有更大的机会为任务找到理想的工具 了。我们会在接下来的两节中详细讨论:Java中的函数和新的Stream API。

    总结下来可能就是这么一句话:语言需要不断改进以跟进硬件的更新或满足程序员的期待 (如果你还不够信服,想想COBOL还一度是商业上最重要的语言之一呢)。

    要坚持下去,Java必须 通过增加新功能来改进,而且只有新功能被人使用,变化才有意义。所以,使用Java 8,你就是 在保护你作为Java程序员的职业生涯。除此之外,我们有一种感觉——你一定会喜欢Java 8的新 功能。随便问问哪个用过Java 8的人,看看他们愿不愿意退回去。还有,用生态系统打比方的话, 新的Java 8的功能使得Java能够征服如今被其他语言占领的编程任务领地,所以Java 8程序员就更 需要学习它了。

    41 条回复    2016-05-19 09:33:29 +08:00
    knightdf
        1
    knightdf  
       2016-05-15 22:33:00 +08:00
    只是有一些地方像 scala 而已, scala 还是要复杂的多
    hujianxin
        2
    hujianxin  
       2016-05-15 23:02:09 +08:00
    别闹了哥们
    tobyxdd
        3
    tobyxdd  
       2016-05-15 23:12:18 +08:00 via Android
    ??
    bramblex
        4
    bramblex  
       2016-05-15 23:21:18 +08:00
    Haskell 党后排瓜子板凳围观即将到来的装逼+撕逼大战
    baozijun
        5
    baozijun  
    OP
       2016-05-16 00:00:44 +08:00
    @hujianxin 没有啦,只是刚看完 java8 实战,全是函数式编程的使用,所以吐槽下
    caixiexin
        6
    caixiexin  
       2016-05-16 00:13:56 +08:00
    stream api 蛮好用的
    Bryan0Z
        7
    Bryan0Z  
       2016-05-16 00:17:36 +08:00 via Android
    其实我也这么觉得……之前试着写 Java 8 ,旁边一只 Java 猿走过来,硬是没看出我在写 Javs
    hantsy
        8
    hantsy  
       2016-05-16 01:00:59 +08:00
    Java 8 算是一次飞跃了。。。用过就知道了。

    1. JVM 层面,引入 Metaspace ,干掉了 Permgen , OutofMem 。。。新的 G1 回收算法。
    2. API 方面就太多了, JSR 310 ,多线程,并行计算, Lambda , FuntionalInteface , Optional , Stream 等等。
    hantsy
        9
    hantsy  
       2016-05-16 01:06:26 +08:00   ❤️ 2
    @baozijun 之前我也只是用一些 Java 8 特性,特别喜欢 JSR 310 。

    后来一个项目用 Spring Integration , 用上了其 Spring Integration Java DSL (它也有 Scala , Groovy DSL ),这东西,根本把 Java 8 的新特性体现出来了。第一次看那个经典的 Cafe 例子,差点晕了。

    https://spring.io/blog/2014/11/25/spring-integration-java-dsl-line-by-line-tutorial

    Cafe 这个例子作经典的 EIP 安案例也有 Apache Camel 版本。
    incompatible
        10
    incompatible  
       2016-05-16 01:06:33 +08:00 via iPhone
    Time API 终于堪用了,把之前的 Date 和 Calendar 设计者的脸打得啪啪响。喜闻乐见。
    hantsy
        11
    hantsy  
       2016-05-16 01:22:34 +08:00
    @incompatible JSR 310 是 Joda Time 的标准化, Spring Data JPA 已经支持(通过 JPA 2.1 的 AttributeConverters 转换,下一代的 JPA 应该会内置支持), Hibernate 5.1 自己也内置支持新的时间了。

    但另外一个 Money API 没进 8 , 也没看到有 9 的计划,有这个处理金融数据方面多了。 Money API Spring 4.1 已经宣称已经支持了。。。 Hibernate 有第三方支持。

    以前的时间, Currency 在地域之间转换考虑不足。
    ayaseangle
        12
    ayaseangle  
       2016-05-16 02:38:15 +08:00
    特性少,语法啰嗦。。
    linux40
        13
    linux40  
       2016-05-16 08:28:25 +08:00 via Android
    我觉得,不向前兼容是这个版本可以叫做一门新语言的必要条件。。。
    PyPog
        14
    PyPog  
       2016-05-16 08:59:28 +08:00 via Android
    让我想起了 Python
    Mutoo
        15
    Mutoo  
       2016-05-16 09:29:04 +08:00
    还有 ActionScript3
    qqmishi
        16
    qqmishi  
       2016-05-16 09:58:49 +08:00 via Android
    以及 swift
    LINEX
        17
    LINEX  
       2016-05-16 10:07:23 +08:00
    有了 lambda 表达式,代码结构变好看了,不过任重道远啊,距离 Scala 还差得远啊~
    NullMan
        18
    NullMan  
       2016-05-16 10:33:19 +08:00   ❤️ 4
    @LINEX 个人认为, Lambda 是 Java 最烂的特性了. 仅仅只是代码变少了而已, 但是变得非常不好读, 不好写. 在你没有那个类库的函数式接口的源码情况下(.jar), 你根本就不晓得那个函数式接口的唯一一个抽象方法名到底叫什么, 参数类型是什么, 返回值是什么类型. 你必须看着这类库的 API 文档写代码.

    我不觉得匿名内部类比 Lambda 差. 匿名内部类, 对编写者, 读者, IDE 都是有好处的. Lambda 对这三者毫无好处. 仅仅只是代码行数变少了而已, 而这在大型工程型项目里, 是微不足道的, 哪怕是在微型项目里也是微不足道的.

    详情见: http://www.importnew.com/10480.html
    reeco
        19
    reeco  
       2016-05-16 10:35:06 +08:00
    @NullMan +1 ,厂里写 Lambda , code review 都过不了
    LINEX
        20
    LINEX  
       2016-05-16 10:55:27 +08:00
    @NullMan
    @reeco
    确实没考虑到可读性,以后还是少用为妙。。。
    bramblex
        21
    bramblex  
       2016-05-16 15:20:07 +08:00
    @NullMan

    因为 lambda 不是这样用的……
    NullMan
        22
    NullMan  
       2016-05-16 15:24:35 +08:00
    @bramblex 是么? 还请指教!
    jsyangwenjie
        23
    jsyangwenjie  
       2016-05-16 15:29:32 +08:00
    别闹了。。写过 Scala 吗。。
    chocotan
        24
    chocotan  
       2016-05-16 15:44:29 +08:00
    @NullMan
    > 在你没有那个类库的函数式接口的源码情况下(.jar), 你根本就不晓得那个函数式接口的唯一一个抽象方法名到底叫什么, 参数类型是什么, 返回值是什么类型. 你必须看着这类库的 API 文档写代码.
    没有接口连编译都不行吧,怎么会不知道接口的参数类型是什么呢
    LINEX
        25
    LINEX  
       2016-05-16 15:56:40 +08:00
    @chocotan 他的意思可能是觉着如果得去看 jar 中的 API 的话会比较麻烦吧,哈哈哈,我说怎么当时看他的回复觉着怪怪的。。。
    LINEX
        26
    LINEX  
       2016-05-16 15:57:10 +08:00
    @bramblex 那 lambda 在什么场景下用会比较合适
    NullMan
        27
    NullMan  
       2016-05-16 16:35:12 +08:00
    @chocotan 我说的是你写的时候, 读的时候, 能看到那函数式接口的那个唯一抽象方法的名字么? 能看到返回值么? 能看到参数的类型么? 如下:

    # 匿名
    Runnable r = new Runnable() {
    void run() {
    // do something
    }
    };

    # lambda
    Runnable r = ClassName::method

    凭你良心说, 到底哪个一眼能看懂?
    Balthild
        28
    Balthild  
       2016-05-16 18:07:28 +08:00 via iPhone
    嗯,毕竟是个 J8 嘛………
    bramblex
        29
    bramblex  
       2016-05-16 20:11:21 +08:00
    @NullMan
    @LINEX

    首先, lambda 表达式在任何地方都不是什么好看的东西,哪怕是在纯函数式语言中大家都会尽量避免使用 lambda ,而是通过一些函数组合达到相应的效果。可见 lambda 表达式其实并不是什么很受待见的东西。

    然而在函数式语言中会大量地构造函数,比如我有一个函数 compose ,它接受两个函数作为参数,并返回一个新函数将接受的两个函数串联起来,这时候就需要利用 lambda 表达式构造一个新的函数作为函数的返回,比如下面这样:

    ``` Haskell
    compose f g = \x -> g (f x)
    ```

    所以在函数式语言, lambda 表达式的实用作用就是在表达式中构造新的函数。但是 Java 并不是一门函数式语言,它没有有事没事就需要构造一个新函数的需求,所以 lambda 表达式只能很尴尬地处于一个并没有什么卵用的语法糖地位
    baozijun
        30
    baozijun  
    OP
       2016-05-16 22:54:33 +08:00
    @jsyangwenjie 只练手写过 cms...
    hinkal
        31
    hinkal  
       2016-05-17 01:08:01 +08:00
    楼上一群人对 lamda 肤浅的理解让我震惊。 Java 8 引入 lamda 表达式带来的不只是语法的简洁明了,更主要的目的是促成了细粒度的代码设计,便于面向并行的算法设计。流与管道以及分割迭代器就很好的体现了这点。以上也全不是我胡诌的, Java 8 lamda 语法的设计者 Stuart Marks 这么说的(我加以归纳总结)。不懂就不要强行装逼,先去看看他的《 Mastering lamda 》一书吧。
    caskeep
        32
    caskeep  
       2016-05-17 01:13:09 +08:00
    看到各位的回复,感觉受教了
    wsdjeg
        33
    wsdjeg  
       2016-05-17 07:32:03 +08:00 via Android
    @hinkal 期待 lamda 已久
    br00k
        34
    br00k  
       2016-05-17 08:44:30 +08:00 via iPhone
    可读性, debug 是有点问题。😂😂观望
    shyling
        35
    shyling  
       2016-05-17 09:17:34 +08:00 via iPad
    ()->{}也不好读不好写的话。。不知道说什么了。
    一个储存可能为 Integer 或 Long 的容器,有必要知道他的具体类型才能使用(a,b)->a>b 这个 Comparator 么
    java 还木有 auto/var 什么的左边的类型推导呢,还觉得类型信息不够,没事多写写 List<String> = new ArrayList<String>();就开心了嘛
    rockyou12
        36
    rockyou12  
       2016-05-17 09:53:17 +08:00
    @hinkal 终于看到个说到我心坎上的了

    上面那些说 lamda 没用的,估计都是只写些 spring 的人吧。但凡是做过 android 开发的,哪个没感受到过回调地狱的恐惧。
    LINEX
        37
    LINEX  
       2016-05-17 10:17:35 +08:00
    @bramblex 原来是这样。
    @hinkal 写作 lambda 不是 lamda ,你理解这么深刻居然还没记住名字,震惊。。。不过我 lambda 绝大多数情况下确实是在 stream 流中用的
    whh945atsyzx
        38
    whh945atsyzx  
       2016-05-17 15:27:47 +08:00
    同感...我都快不会用 java 了.....
    miaoxinwei
        39
    miaoxinwei  
       2016-05-18 19:41:38 +08:00
    @LINEX 我也只在 stream 中用到 lambda
    Owenjia
        40
    Owenjia  
       2016-05-19 02:57:43 +08:00 via Android
    @LINEX 这两种拼写都是对的吧? unicode 里就用了 lamda 这个拼写。
    LINEX
        41
    LINEX  
       2016-05-19 09:33:29 +08:00
    @Owenjia 搜了搜网上说 lamda 的比较少,好像在 C#里是这么说的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1359 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 23:35 · PVG 07:35 · LAX 16:35 · JFK 19:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.