和 JDK7 还没有热和,却开始关注 JDK8 起来了,JDK8 已进行到了 M8 开发预览版了,其中包含了一个千呼万唤的功能,即 Lambda 闭包的支持。在当前有对闭包特性的诉求,而 Java 本身不提供时,我们不得不转而求助于 JVM 上的其他的语言, 像 Scala, Groovy, JRuby 等。
不得不说 Scala 给我们带来了不少的快感,以致于想以更多的精力投入到 Scala 编程中去,不过还正在换取项目实践的机会。JDK8 引入 Lambda 后同样也是能更好的解决多核计算的问题,从程序员的角度来看,只要觉得 Lambda 能给我们带来无与伦比的灵活与便利性就足够了,水很深。
JDK8 还有增加的功能就是 JEP(JDK Enhancement-Proposal) 中的了。
来这里 http://openjdk.java.net/projects/jdk8/ 看看 JDK8 的里程碑
2012/04/26 M1
2012/06/14 M2
2012/08/02 M3
2012/09/13 M4
2012/11/29 M5
2013/01/31 M6
2013/06/13 M7 Feature Complete
2013/09/05 M8 Developer Preview
2014/01/23 M9 Final Release Candidate
2014/03/18 GA General Availability
JDK8 语言上的几大特性有:
- Lambda 表达式 (俗称 闭包,或匿名方法)
- 方法引用(引入了像 C++ 的 :: 操作符)
- 更精悍的类型推断(可由方法上下文和调用链上对返回值类型进行推断,JDK7 在推断类型和异常时已有些长进)
- 接口中可以有默认的静态实现(就不怕二义性了?不要怕颠覆)
我们现在来搭建 JDK8 开发平台,只见识一下 Java 的 Lambda,于此让大家看出,这就是 JDK8。有以下几个要点:
下载、安装 JDK8 开发预览版
可以到 http://jdk8.java.net/download.html 来下载 JDK8 的开发预览版本,选择你适合的平台。安装后,按需设置好 JAVA_HOME,PATH 环境变量,这个不细说。
然后是 IDE 的支持,有了 JDK8 的 javac, java 两工具,你要在控制台加文本编辑器中来体验当然是可以的,但如此,这般你无法得到像 IDE 那样智能的提示,能促使你去触类旁通,进而了出个所以然来。像 list.forEach(x -> System.out.print(x)); 这一写法实质就是:
1 2 3 4 5 |
list.forEach(new Consumer<String>() { public void accept(String x) { System.out.println(x); } }); |
关键在 Consumer 类上,我们对 list.forEach(x -> System.out.print(x)); 代码生成的类用 javap -c 去反编译也可以看到 Consumer 的实现。我剔除了其中的注释代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
package java.util.function; import java.util.Objects; @FunctionalInterface public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) { Objects.requireNonNull(after); return (T t) -> { accept(t); after.accept(t); }; } } |
还有不少类在 java.util.function 包中,如 Function, Predicate, Supplier, 及带类型的 DoubleFunction, IntConsumer, LongPredicate, IntSupplier, IntUnaryOperator 等这样的类,一看到 @FunctionalInterface 及 function 这样的包样,我们立马就领略到已进入到了函数式编程的领域。
本人不认为编程界真正的高手用记事本写程序,何苦又何必呢? 君子善假于物也,非性也。
当前能够支持 JDK8 的 IDE 有三款,也就是流行的 IDE 都对 JDK8 紧紧的跟进了。
Netbeans 8 Nightly Builds 版,从这里 http://bits.netbeans.org/dev/nightly/latest/ 下载,能有多新就下多新的吧。然后可能(比如有多个 JDK 而未把 JDK8设置为 JAVA_HOME 时)要对 Netbeans 指定 JDK8,办法参考: http://stackoverflow.com/questions/6950960/how-to-point-netbeans-to-new-jdk
2013.10.16 更新刚发布的 NetBeans IDE 7.4 正式版已经支持了 JDK8 ,不需要使用 Nightly Build 版了。
举个例子,在我的 Mac OS X 环境中,编辑 netbeans.conf 文件
sudo vi /Applications/NetBeans/NetBeans Dev 201309130002.app/Contents/Resources/NetBeans/etc/netbeans.conf
其中加上这个
#这是我机器上的 JDK8 的 HOME 目录, 酌情而定
netbeans_jdkhome="/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home"
或者你也可以建立了 Java 项目后逐层加上 JAVA8
项目属性/Libraries/Manage Platforms.../Add Platform.../选择 Platform 目录。
现在可以在 Netbeans 中写 Java 闭包了
IntelliJ IDEA 12,无论你下载 30 天试用的 Ultimate Edition,还是 Community Edition,都支持 JDK8 的。IDEA 确实是很强大,可是太贵了,若非公司来推,我还是不冒这个险,社区版还是随意的。
在创建项目时设置 Project SDK,或是在项目的上下文菜单中,进入模块设定,再来到项目设置中,选择 JDK8,下拉中没有则 New 一个,指定到 JDK8 的 Home 目录
最后,要支持 Lambda,把 Project language level 设置为 8.0 - Lambdas, type annotations etc.
来看看 Lambda 是怎么深发展的
这里唱主角的是 java.util.stream.Stream, 它的方法可以让你真真正正做 Scala 里那些 map 操作了,譬如集合中所有属性值组成新的集合,拣出符合条件的记录,映射转换。有了它从此 Apache Commons CollectionUtils 就只能作壁上观了,束之高阁还嫌占了位。
非官方的代号为 Luna 的 Eclipse 4.4
下载位置:http://downloads.efxclipse.org/eclipse-java8/写本文时最新的是 2013-09-13 编译版,Linux, Mac, Windows 版还尽有。设置中 JDK 编译级别可以选到 1.8 (BETA)。
这个可更好逆天了,接口都能用方法体了,于是乎实现多个接口又回归到从前的多重实现的继承了。其实这也是为 Lambda 的作的一个铺垫。
更多关于 Lambda 的内容可以看 http://openjdk.java.net/projects/lambda/。
目前在 Youtube 上已经有不少介绍 JDK8 的视频了,GA 版的发布时间是 2014/03/18,还有不少时间去慢慢熟悉它,仍然用最顺手的 Eclipse 去体验。
Java8 准时在 2014/03/18 发布了,同时 NetBeans 8 和 IntelliJ IDEA 13 对 Java8 有了强有力的支持。IntelliJ IDEA 可以下载免费的 Community Edition。然后 Eclipse Luna 的步伐显得有点慢了,它还处在 BETA 版中, 正式版应该也快了; 也可为 Eclipse 4.3 Kepler SR2 打上这个补丁 P20140317-1600 来支持 Java8。
Eclipse Luna 的 Milestones 是
M6 2014-03-07 4.4M6 (API Freeze)
M7 2014-05-02 4.4M7 (Feature Freeze)
目标是在 2014 年 6 月晚些时候完成
本文链接 https://yanbin.blog/setting-jdk8-programming-environment/, 来自 隔叶黄莺 Yanbin Blog
[版权声明] 本文采用 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 进行许可。