什麼是lambda
lambda是一種匿名表達式,retrolambda使得Android能使用lambda特性,舉個例子:
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("wxl", "retrolambda test");
}
});
使用 lambda
view.setOnClickListener(
v -> Log.d("wxl", "retrolambda test"));
Android如何使用
這裏是使用Retrolambda的gradle插件,這樣就可以在代碼中使用lambda了。 Android Studio配置Retrolambda
lambda需要安裝JDK8,下載最新版本jdk-8u73 build.gradle
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'me.tatarka:gradle-retrolambda:3.2.4'//加上這句依賴,這會使用retrolambda來編譯Java代碼
}
}
app/build.gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'//加上這句加,入plugin聲明
android {
……
compileOptions {//使用JAVA8語法解析
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
retrolambda {//指定將源碼編譯的級別,使用下列代碼,會將代碼編譯到兼容1.6的字節碼格式
javaVersion JavaVersion.VERSION_1_6
}
Android Studio自動生成lambda
這裏寫圖片描述
當配置Retrolambda成功後,Android Studio會有提示,按Alt+Enter鍵 這裏寫圖片描述
點擊替換,這樣就能自動生成,使用lambda了。到這裏我就可以洗洗睡了,也很晚了,但爲什麼可以這樣寫呢,還是來簡單瞭解lambda語法吧。 lambda語法簡介
基本格式
input -> body
intput種類
無輸入 void () -> body
new Thread(new Runnable() {
@Override
public void run() {
Log.d("wxl", "retrolambda test");
}
});
使用 lambda
new Thread(() -> Log.d("wxl", "retrolambda test"));
一個參數輸入
x -> body
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("wxl", "retrolambda test");
}
});
使用 lambda
view.setOnClickListener(
v -> Log.d("wxl", "retrolambda test"));
多個參數輸入
(x, y) -> x + y;
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
for (String name : names) {
Log.d("wxl", name);
}
使用 lambda
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
Collections.sort(names, (a, b) -> b.compareTo(a));
for (String name : names) {
Log.d("wxl", name);
}
不省略型別 (int x, int y) -> x + y;
body 種類
什麼都不做
() -> {} 單行不需要有返回值,單行可省略{}
(x, y) -> x + y; 單行需要有返回值
(x, y) -> x + y//注意沒有分號結尾
Observable.just("Hello", "RxJava")
.map(new Func1<String, String>() {
@Override
public String call(String s) {
return s.toUpperCase();
}
});
使用 lambda
Observable.just("Hello", "RxJava")
.map(s -> s.toUpperCase());
多行不需要有返回值
(x, y) ->{ x x; y y; }
多行需要有返回值
(x, y) ->{ x x; y y; return x + y; }