Retrolambda
參考文件
ref | link |
---|---|
retrolambda | https://github.com/orfjackal/retrolambda |
gradle-retrolambda | https://github.com/evant/gradle-retrolambda |
為何要使用?
Android 目前最高支援到 Java7,言下之意就是 Java8 的東西我們都沒有辦法使用
為了能讓 Android 也能使用 Java8 lambda ,享受到新語法的快感(誤
什麼是 lambda?
lambda 是一種匿名(Anonymous) 表達式,這樣說好像有點抽象,用個例子示範一下
//未使用 lambda
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
System.out.println("click")
}
});
//使用 lambda
button.setOnClickListener(view -> {
System.out.println("click")
});
//還可以更簡化
button.setOnClickListener(view -> System.out.println("click"));
Thread 的 Runable 也是一個常用但囉說的語法,我們一樣可以透過 lambda 簡化它
//未使用 lambda
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("run");
}
});
//使用 lambda
new Thread(() -> System.out.println("run"));
lambda 語法
input -> body
view -> System.out.println("click")
intput 種類
無輸入 void
() -> body
單個輸入
x -> System.out.println(x)
多個輸入
(x, y) -> x + y;
不省略型別
(int x, int y) -> x + y;
body 種類
什麼都不做
() -> {}
單行不回傳,單行可省略{}
(x, y) -> x + y;
單行回傳
(x, y) -> x + y
多行不回傳
(x, y) ->{
x * x;
y * y;
}
多行回傳
(x, y) ->{
x * x;
y * y;
return x + y;
}
如何在 Android 使用
我是使用 gradle-retrolambda 的 gradle 的 plugin,使用方法如下
安裝jdk8
在 build.gradle 的最前面加上下列語法
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:3.1.0'
}
}
repositories {
mavenCentral()
}
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
- 接著在 gradle android{}下 加上 retrolamdba
retrolambda {
// 官方建議使用環境變數,不過我這邊路經都回傳 null
//jdk System.getenv("JAVA8_HOME")
//oldJdk System.getenv("JAVA6_HOME")
//下列是我 mac java7 及 java8 的相對路徑
jdk '/Library/Java/JavaVirtualMachines/jdk1.8.0_45.jdk/Contents/Home'
oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_15.jdk/Contents/Home'
javaVersion JavaVersion.VERSION_1_7
jvmArgs '-noverify'
defaultMethods false
incremental true
}
- 最後在 android{} 下加入下列語法
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
- 其他參數設定可參考原作者連結 gradle-retrolambda