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

2016-05-15 22:18:49 +08:00
 baozijun
感觉完全就是 scala 了.....
8500 次点击
所在节点    程序员
41 条回复
bramblex
2016-05-16 15:20:07 +08:00
@NullMan

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

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

# lambda
Runnable r = ClassName::method

凭你良心说, 到底哪个一眼能看懂?
Balthild
2016-05-16 18:07:28 +08:00
嗯,毕竟是个 J8 嘛………
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
2016-05-16 22:54:33 +08:00
@jsyangwenjie 只练手写过 cms...
hinkal
2016-05-17 01:08:01 +08:00
楼上一群人对 lamda 肤浅的理解让我震惊。 Java 8 引入 lamda 表达式带来的不只是语法的简洁明了,更主要的目的是促成了细粒度的代码设计,便于面向并行的算法设计。流与管道以及分割迭代器就很好的体现了这点。以上也全不是我胡诌的, Java 8 lamda 语法的设计者 Stuart Marks 这么说的(我加以归纳总结)。不懂就不要强行装逼,先去看看他的《 Mastering lamda 》一书吧。
caskeep
2016-05-17 01:13:09 +08:00
看到各位的回复,感觉受教了
7jmS8834H50s975y
2016-05-17 07:32:03 +08:00
@hinkal 期待 lamda 已久
br00k
2016-05-17 08:44:30 +08:00
可读性, debug 是有点问题。😂😂观望
shyling
2016-05-17 09:17:34 +08:00
()->{}也不好读不好写的话。。不知道说什么了。
一个储存可能为 Integer 或 Long 的容器,有必要知道他的具体类型才能使用(a,b)->a>b 这个 Comparator 么
java 还木有 auto/var 什么的左边的类型推导呢,还觉得类型信息不够,没事多写写 List<String> = new ArrayList<String>();就开心了嘛
rockyou12
2016-05-17 09:53:17 +08:00
@hinkal 终于看到个说到我心坎上的了

上面那些说 lamda 没用的,估计都是只写些 spring 的人吧。但凡是做过 android 开发的,哪个没感受到过回调地狱的恐惧。
m8syYID5eaas8hF7
2016-05-17 10:17:35 +08:00
@bramblex 原来是这样。
@hinkal 写作 lambda 不是 lamda ,你理解这么深刻居然还没记住名字,震惊。。。不过我 lambda 绝大多数情况下确实是在 stream 流中用的
whh945atsyzx
2016-05-17 15:27:47 +08:00
同感...我都快不会用 java 了.....
miaoxinwei
2016-05-18 19:41:38 +08:00
@LINEX 我也只在 stream 中用到 lambda
Owenjia
2016-05-19 02:57:43 +08:00
@LINEX 这两种拼写都是对的吧? unicode 里就用了 lamda 这个拼写。

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

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

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

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

© 2021 V2EX