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

2017-03-22 13:27:43 +08:00
 Cbdy

今天中午的时候有人给我一段 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 的厂多不多

6536 次点击
所在节点    JavaScript
21 条回复
seeker
2017-03-22 13:45:33 +08:00
在古代, functional, static type 语言的 ML 系祖宗们就这么搞了
phx13ye
2017-03-22 13:50:32 +08:00
lambda 表达式,箭头函数听的我头皮发麻
dhssingle
2017-03-22 13:54:19 +08:00
Java 是 Java 8 才开始支持 Lambda 表达式的吧
otakustay
2017-03-22 13:57:51 +08:00
因为这货是个数学符号,初中高中都用过吧……
jarlyyn
2017-03-22 14:03:19 +08:00
这时候必须提世界上最好的语言了
Cbdy
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
2017-03-22 18:25:21 +08:00
为了简单吧.

就像运算符 `? :`.
xiparos
2017-03-22 18:57:02 +08:00
1L +1, Java 不过东施效颦而已
tlday
2017-03-22 19:34:24 +08:00
历史传统吧。不过没有人觉得给这种只使用一次的函数再想个名字很麻烦吗。。。而且这种声明方式很适合做函数柯里化啊。
jiangzhuo
2017-03-22 20:06:40 +08:00
PHP :喵?喵?喵?
Perl :喵?喵?喵?
yangff
2017-03-22 20:55:51 +08:00
@phx13ye lambda function 说的是匿名函数,和 arrow function 不完全是一回事……
Cbdy
2017-03-22 21:25:30 +08:00
@yangff 怎么说?
owt5008137
2017-03-22 21:39:00 +08:00
妈蛋,我还以为啥呢。原来是 lambda 表达式
coa
2017-03-22 23:30:54 +08:00
JS 的箭头好歹可做 lambda 表达式还不绑定 this ,好处不少, PHP 的箭头那叫一个郁闷,用点语法多轻快。。。
svenFeng
2017-03-22 23:58:08 +08:00
是时候看一波 haskell 就习惯了(・∀・)
msg7086
2017-03-23 00:06:45 +08:00
@yangff 这里的 arrow function 不就是 Lambda 么?
Jimrussell
2017-03-23 11:19:37 +08:00
毕竟现在都流行函数式, 而箭头函数就是函数式语言思维的语法糖
这个语法糖的卖点是所谓"看起来优雅"
ChefIsAwesome
2017-03-23 11:44:01 +08:00
因为可以少打点字啊。这东西只有一行的话看着很舒服,带嵌套的看着就恶心了,就像你那个 pipe 函数写的,看着不受罪吗?
danielmiao
2017-03-23 13:01:06 +08:00
看起来太费劲了。。。
Chieh
2017-03-23 15:13:47 +08:00
这是 Lambda 表达式,你觉得用符号方便还是写函数方便

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/349432

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX