Lambdas
首先,我们需要下载个支持lambda的jdk,有两种方式可以获取到:
• 一个用于敢于尝试的人:从sources 源码自己构建
• 快捷版:直接下载编译好的sdk
最初,我使用源码构建,但由于时间原因,再加上和环境变量有关的一些警告,我选择了偷懒的方法:使用已经构建好的jdk。另外一个重要的工具,是文本编辑器用它来写代码。在以前,jdk刚发布后一段时间,一个支持的IDE才产生。但这次不同了,也可能由于openjdk提供的透明和应用广泛的jdk有关。几天前,JetBrain第一个支持java8的IDE发布了。因此,IntelliJ IDEA 12成了第一个支持JDK8的IDE,除此之外的改进呢?处于测试目的,我在win7 x64机器上安装了支持jdk8 b68的IntelliJ 12社区版本。那些喜欢Netbeans的开发者,可以猛戳此处 download下载对lambda支持的包。
调整到合适的心态
想要尝试运用最新的特性编写出更加高效和整洁的代码,你必须了解一下几个新的概念--好吧,至少鄙人需要。什么是lambda表达式?
最简单的看待lambda表达式的方式就是,你可以把它看做一个方法:”它提供一系列的正式的参数和一个通过这些参数来表述逻辑的方法体---它可以是一个表达式或者一个代码段。lambda表达式的参数可以是声名的或者引用的,当这些参数是引用类型的时候,那么这些类型就是源于针对lambda表达式的功能性接口。从返回值来看,一个lambda表达式可以是无返回值的--它们不返回任何结果,或者是有返回值的--在表达式里面的某个执行语句返回一个值。
下面是一个lambda表达式的例子:
(b) (int a, int b) -> {
if (a > b) {
return a;
} else if (a == b) {
return a * b;
} else {
return b;
}
}
什么是功能性接口呢?一个功能性接口就是一个只含有抽象方法的接口,只是声名了一个函数。在某些场合下,这个唯一的函数可能是一个带有重载因子的的多态函数,这种情况下,所有的函数对外都是一个函数。除了典型的通过新建和初始化一个类来新建一个接口实例,功能性接口实例还可以通过使用一个lambda表达式、方法、或者构造引用来达到新建实例的效果。下面是一个功能性接口的例子:
public interface FuncInterface {
public void invoke(String s1, String s2);
}
下面是来自java api的功能性接口:
java.lang.Runnable
java.util.concurrent.Callable
java.awt.event.ActionListener
接下来让我们来看看一个线程的启动在future中可能会发生怎么的变化:
旧方式:
@Override
public void run() {
for (int i=0; i< 9; i++) {
System.out.println(String.format("Message #%d from inside the thread!", i));
}
}
}).start();
新方式:
for (int i=0; i< 9; i++) {
System.out.println(String.format("Message #%d from inside the thread!", i));
}
}).start();