今天中午的时候有人给我一段 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 的厂多不多
1
seeker 2017-03-22 13:45:33 +08:00
在古代, functional, static type 语言的 ML 系祖宗们就这么搞了
|
2
phx13ye 2017-03-22 13:50:32 +08:00 via iPhone
lambda 表达式,箭头函数听的我头皮发麻
|
3
dhssingle 2017-03-22 13:54:19 +08:00
Java 是 Java 8 才开始支持 Lambda 表达式的吧
|
4
otakustay 2017-03-22 13:57:51 +08:00
因为这货是个数学符号,初中高中都用过吧……
|
5
jarlyyn 2017-03-22 14:03:19 +08:00
这时候必须提世界上最好的语言了
|
6
Cbdy OP @phx13ye 不是我自创的,大家都这么叫, ruby, python 的可能叫 lambda 表达式吧
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_functions |
7
iugo 2017-03-22 18:25:21 +08:00
为了简单吧.
就像运算符 `? :`. |
8
xiparos 2017-03-22 18:57:02 +08:00
1L +1, Java 不过东施效颦而已
|
9
tlday 2017-03-22 19:34:24 +08:00
历史传统吧。不过没有人觉得给这种只使用一次的函数再想个名字很麻烦吗。。。而且这种声明方式很适合做函数柯里化啊。
|
10
jiangzhuo 2017-03-22 20:06:40 +08:00 via iPhone
PHP :喵?喵?喵?
Perl :喵?喵?喵? |
13
owt5008137 2017-03-22 21:39:00 +08:00 via Android
妈蛋,我还以为啥呢。原来是 lambda 表达式
|
14
coa 2017-03-22 23:30:54 +08:00
JS 的箭头好歹可做 lambda 表达式还不绑定 this ,好处不少, PHP 的箭头那叫一个郁闷,用点语法多轻快。。。
|
15
Em5O7B1JGfjQnBry 2017-03-22 23:58:08 +08:00 via Android
是时候看一波 haskell 就习惯了(・∀・)
|
17
Jimrussell 2017-03-23 11:19:37 +08:00
毕竟现在都流行函数式, 而箭头函数就是函数式语言思维的语法糖
这个语法糖的卖点是所谓"看起来优雅" |
18
ChefIsAwesome 2017-03-23 11:44:01 +08:00
因为可以少打点字啊。这东西只有一行的话看着很舒服,带嵌套的看着就恶心了,就像你那个 pipe 函数写的,看着不受罪吗?
|
19
danielmiao 2017-03-23 13:01:06 +08:00
看起来太费劲了。。。
|
20
Chieh 2017-03-23 15:13:47 +08:00 via Android
这是 Lambda 表达式,你觉得用符号方便还是写函数方便
|
21
q397064399 2017-03-23 21:00:11 +08:00
语法糖而已, java 这种 自带各种超级牛逼的编辑器的玩意,匿名类跟 Lamada 区别不大,我是坚持不用 lamada
|