追加下《java8实战》原文:
你之前已经见过了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程序员就更 需要学习它了。
1
knightdf 2016-05-15 22:33:00 +08:00
只是有一些地方像 scala 而已, scala 还是要复杂的多
|
2
hujianxin 2016-05-15 23:02:09 +08:00
别闹了哥们
|
3
tobyxdd 2016-05-15 23:12:18 +08:00 via Android
??
|
4
bramblex 2016-05-15 23:21:18 +08:00
Haskell 党后排瓜子板凳围观即将到来的装逼+撕逼大战
|
6
caixiexin 2016-05-16 00:13:56 +08:00
stream api 蛮好用的
|
7
Bryan0Z 2016-05-16 00:17:36 +08:00 via Android
其实我也这么觉得……之前试着写 Java 8 ,旁边一只 Java 猿走过来,硬是没看出我在写 Javs
|
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 等等。 |
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 版本。 |
10
incompatible 2016-05-16 01:06:33 +08:00 via iPhone
Time API 终于堪用了,把之前的 Date 和 Calendar 设计者的脸打得啪啪响。喜闻乐见。
|
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 在地域之间转换考虑不足。 |
12
ayaseangle 2016-05-16 02:38:15 +08:00
特性少,语法啰嗦。。
|
13
linux40 2016-05-16 08:28:25 +08:00 via Android
我觉得,不向前兼容是这个版本可以叫做一门新语言的必要条件。。。
|
14
PyPog 2016-05-16 08:59:28 +08:00 via Android
让我想起了 Python
|
15
Mutoo 2016-05-16 09:29:04 +08:00
还有 ActionScript3
|
16
qqmishi 2016-05-16 09:58:49 +08:00 via Android
以及 swift
|
17
m8syYID5eaas8hF7 2016-05-16 10:07:23 +08:00
有了 lambda 表达式,代码结构变好看了,不过任重道远啊,距离 Scala 还差得远啊~
|
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 |
20
m8syYID5eaas8hF7 2016-05-16 10:55:27 +08:00
|
23
jsyangwenjie 2016-05-16 15:29:32 +08:00
别闹了。。写过 Scala 吗。。
|
24
chocotan 2016-05-16 15:44:29 +08:00
@NullMan
> 在你没有那个类库的函数式接口的源码情况下(.jar), 你根本就不晓得那个函数式接口的唯一一个抽象方法名到底叫什么, 参数类型是什么, 返回值是什么类型. 你必须看着这类库的 API 文档写代码. 没有接口连编译都不行吧,怎么会不知道接口的参数类型是什么呢 |
25
m8syYID5eaas8hF7 2016-05-16 15:56:40 +08:00
@chocotan 他的意思可能是觉着如果得去看 jar 中的 API 的话会比较麻烦吧,哈哈哈,我说怎么当时看他的回复觉着怪怪的。。。
|
26
m8syYID5eaas8hF7 2016-05-16 15:57:10 +08:00
@bramblex 那 lambda 在什么场景下用会比较合适
|
27
NullMan 2016-05-16 16:35:12 +08:00
@chocotan 我说的是你写的时候, 读的时候, 能看到那函数式接口的那个唯一抽象方法的名字么? 能看到返回值么? 能看到参数的类型么? 如下:
# 匿名 Runnable r = new Runnable() { void run() { // do something } }; # lambda Runnable r = ClassName::method 凭你良心说, 到底哪个一眼能看懂? |
28
Balthild 2016-05-16 18:07:28 +08:00 via iPhone
嗯,毕竟是个 J8 嘛………
|
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 表达式只能很尴尬地处于一个并没有什么卵用的语法糖地位 |
30
baozijun OP @jsyangwenjie 只练手写过 cms...
|
31
hinkal 2016-05-17 01:08:01 +08:00
楼上一群人对 lamda 肤浅的理解让我震惊。 Java 8 引入 lamda 表达式带来的不只是语法的简洁明了,更主要的目的是促成了细粒度的代码设计,便于面向并行的算法设计。流与管道以及分割迭代器就很好的体现了这点。以上也全不是我胡诌的, Java 8 lamda 语法的设计者 Stuart Marks 这么说的(我加以归纳总结)。不懂就不要强行装逼,先去看看他的《 Mastering lamda 》一书吧。
|
32
caskeep 2016-05-17 01:13:09 +08:00
看到各位的回复,感觉受教了
|
33
7jmS8834H50s975y 2016-05-17 07:32:03 +08:00 via Android
@hinkal 期待 lamda 已久
|
34
br00k 2016-05-17 08:44:30 +08:00 via iPhone
可读性, debug 是有点问题。😂😂观望
|
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>();就开心了嘛 |
36
rockyou12 2016-05-17 09:53:17 +08:00
|
37
m8syYID5eaas8hF7 2016-05-17 10:17:35 +08:00
|
38
whh945atsyzx 2016-05-17 15:27:47 +08:00
同感...我都快不会用 java 了.....
|
39
miaoxinwei 2016-05-18 19:41:38 +08:00
@LINEX 我也只在 stream 中用到 lambda
|
41
m8syYID5eaas8hF7 2016-05-19 09:33:29 +08:00
@Owenjia 搜了搜网上说 lamda 的比较少,好像在 C#里是这么说的
|