V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
Cbdy
V2EX  ›  JavaScript

箭头函数为啥这么流行?从 JavaScript 到 Java

  •  
  •   Cbdy · 2017-03-22 13:27:43 +08:00 · 6696 次点击
    这是一个创建于 2804 天前的主题,其中的信息可能已经有所发展或是发生改变。

    今天中午的时候有人给我一段 JavaScript 代码,问我为什么等于 12 ,如下所示

    const pipeline = (...funcs) =>
      val => funcs.reduce((a, b) => b(a), val)
    
    const plus1 = a => a + 1
    const mult2 = a => a * 2
    const addThenMult = pipeline(plus1, mult2)
    
    let r = addThenMult(5)
    

    他可能对箭头函数不太熟悉,于是我让他把箭头换成 function ,他立刻就懂了。然后我表示现在很多语言用箭头表示一个可以计算的代码块, Java 也可以,然后我真的尝试用 Java 写了一下

    Function<Stream<Function<Integer, Integer>>, Function<Integer, Integer>>
      pipline = funcs -> val -> funcs.reduce((a, b) -> b.compose(a)).get().apply(val);
    
    Function<Integer, Integer> plus1 = a -> a + 1;
    Function<Integer, Integer> mult2 = a -> a * 2;
    Function<Integer, Integer> addThenMult = pipline.apply(Stream.of(plus1, mult2));
    
    Integer r = addThenMult.apply(5);
    

    结果是写出来几乎没什么差别,相比 Java7 的时候的匿名内部类,这应该算是很大的进步了。我想这应该就是 Google 放弃 Jack 改用 Javac 的原因吧,不知道现在用 Java8 的厂多不多

    21 条回复    2017-03-23 21:00:11 +08:00
    seeker
        1
    seeker  
       2017-03-22 13:45:33 +08:00
    在古代, functional, static type 语言的 ML 系祖宗们就这么搞了
    phx13ye
        2
    phx13ye  
       2017-03-22 13:50:32 +08:00 via iPhone
    lambda 表达式,箭头函数听的我头皮发麻
    dhssingle
        3
    dhssingle  
       2017-03-22 13:54:19 +08:00
    Java 是 Java 8 才开始支持 Lambda 表达式的吧
    otakustay
        4
    otakustay  
       2017-03-22 13:57:51 +08:00
    因为这货是个数学符号,初中高中都用过吧……
    jarlyyn
        5
    jarlyyn  
       2017-03-22 14:03:19 +08:00
    这时候必须提世界上最好的语言了
    Cbdy
        6
    Cbdy  
    OP
       2017-03-22 14:50:56 +08:00
    @phx13ye 不是我自创的,大家都这么叫, ruby, python 的可能叫 lambda 表达式吧
    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions
    iugo
        7
    iugo  
       2017-03-22 18:25:21 +08:00
    为了简单吧.

    就像运算符 `? :`.
    xiparos
        8
    xiparos  
       2017-03-22 18:57:02 +08:00
    1L +1, Java 不过东施效颦而已
    tlday
        9
    tlday  
       2017-03-22 19:34:24 +08:00
    历史传统吧。不过没有人觉得给这种只使用一次的函数再想个名字很麻烦吗。。。而且这种声明方式很适合做函数柯里化啊。
    jiangzhuo
        10
    jiangzhuo  
       2017-03-22 20:06:40 +08:00 via iPhone
    PHP :喵?喵?喵?
    Perl :喵?喵?喵?
    yangff
        11
    yangff  
       2017-03-22 20:55:51 +08:00
    @phx13ye lambda function 说的是匿名函数,和 arrow function 不完全是一回事……
    Cbdy
        12
    Cbdy  
    OP
       2017-03-22 21:25:30 +08:00
    @yangff 怎么说?
    owt5008137
        13
    owt5008137  
       2017-03-22 21:39:00 +08:00 via Android
    妈蛋,我还以为啥呢。原来是 lambda 表达式
    coa
        14
    coa  
       2017-03-22 23:30:54 +08:00
    JS 的箭头好歹可做 lambda 表达式还不绑定 this ,好处不少, PHP 的箭头那叫一个郁闷,用点语法多轻快。。。
    svenFeng
        15
    svenFeng  
       2017-03-22 23:58:08 +08:00 via Android
    是时候看一波 haskell 就习惯了(・∀・)
    msg7086
        16
    msg7086  
       2017-03-23 00:06:45 +08:00
    @yangff 这里的 arrow function 不就是 Lambda 么?
    Jimrussell
        17
    Jimrussell  
       2017-03-23 11:19:37 +08:00
    毕竟现在都流行函数式, 而箭头函数就是函数式语言思维的语法糖
    这个语法糖的卖点是所谓"看起来优雅"
    ChefIsAwesome
        18
    ChefIsAwesome  
       2017-03-23 11:44:01 +08:00
    因为可以少打点字啊。这东西只有一行的话看着很舒服,带嵌套的看着就恶心了,就像你那个 pipe 函数写的,看着不受罪吗?
    danielmiao
        19
    danielmiao  
       2017-03-23 13:01:06 +08:00
    看起来太费劲了。。。
    Chieh
        20
    Chieh  
       2017-03-23 15:13:47 +08:00 via Android
    这是 Lambda 表达式,你觉得用符号方便还是写函数方便
    q397064399
        21
    q397064399  
       2017-03-23 21:00:11 +08:00
    语法糖而已, java 这种 自带各种超级牛逼的编辑器的玩意,匿名类跟 Lamada 区别不大,我是坚持不用 lamada
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5596 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 01:36 · PVG 09:36 · LAX 17:36 · JFK 20:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.