每次写 Ruby 的时候,用 Ruby 的 Block 语法都写的我身心舒畅。lambda 表达式和闭包,已经是现代语言的标配了, 甚至很多基于 JVM 的语言都有了这些特性,比如 Groovy,Scala,Clojure,但是 Java 这位老大哥却迟迟不上。 虽然在 Java 中用匿名类可以实现这些特性,但是这代码量,实在是惨不忍睹,太不美了。 值得庆幸的是,随着 Java 8 的发布,终于给 Java 这个笨重的家伙带来了一些些灵动。
Java 8 lambda
Java 8 lambda 的语法如下:
public void runThread() {
new Thread(new Runnable() {
public void run() {
System.out.println("Run!");
}
}).start();
}
public void runThreadUseLambda() {
new Thread(() -> {
System.out.println("Run!");
}).start();
}
// 还可以简化成这样
public void runThreadUseLambdaMore() {
new Thread(() -> System.out.println("Run!")).start();
}
有了 lambda 表达式,就可以把 List 的操作写得跟 Ruby 的 Array 操作一样优美
# ruby version
[1, 2, 3].map { |i| i * 2 } # => [2, 4, 6]
// Java version
Lists.newArrayList(1, 2, 3).map((i) -> i * 2) // => [2, 4, 6]
// or 更简化
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
List<Person> persons = Lists.newArrayList();
for (int i = 0; i < 3; i++) {
persons.add(new Person("Person " + i));
}
persons.map(Person::getName) // => ["Person0", "Person1", "Person2"]
Lambda 大法好,退匿名类保平安!!!
但是!!
Android 不支持 Java 8…
Android 开发的同胞们也不用灰心,这位大神 Esko Luontola 写出这个 Retrolambda 神器,神器在手,天下我有,Android 可以使用 Java 8 的 lambda 表达式啦。
Retrolambda
想在项目中使用 Retrolambda,得先配置一下。下面以 Android Studio 为例。
Android Studio 使用 Gradle 作为 构建工具,所以我们还需要 retrolambda-gradle 来帮助我们在 Gradle 中加入 Retrolambda。
当然,要用 Java 8 的特性,肯定要先安装 Java 8, 下载安装 jdk8。
然后配置好环境变量 JAVA8_HOME
。原来的 Java 版本也不能丢,使用 Java 6 的配置好 JAVA6_HOME
,使用 Java 7 的配置好 JAVA7_HOME
。
然后在 build.gradle
中加入下面的内容:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:2.2.2'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'retrolambda'
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
OK,Sync Project with Gradle File,搞定,打完收工。 赶紧在自己的代码里体验 lambda 之美吧。。。