Lambda表達式是在JDK 8中開始支持的一種函數式推導語言,能夠大量減少匿名內部類那種冗餘的代碼。在Android中,可以大量使用在設置監聽,設置異步回調等場景。
目前Android開發已經漸漸到從Eclipse 的ADT遷移到了Android Studio,但是Android Studio目前的版本還沒有直接支持Lambda表達式的支持,需要插件支持,當然,JDK版本也必須使用JDK 8 或者以上(當然過些時間會有更高版本的JDK)。
1.引入retrolambda插件:
在Project的build.gradle中添加
apply plugin: ‘me.tatarka.retrolambda‘
2. 設置編譯選項(可能也可以不寫)
在Project的build.gradle的android節點中添加如下代碼
compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 }
3. 引入retrolambda的類路徑,在Module:app的build.gradle中的buildscript->dependencies節點中添加如下代碼
classpath ‘me.tatarka:gradle-retrolambda:3.2.0‘
4. 對build.gradle進行build
5.編寫測試代碼,簡單寫法如下
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.text);
textView.setOnClickListener( v -> Toast.makeText(getApplicationContext(), "Lambda", Toast.LENGTH_LONG).show());
}
6.運行查看是否正常
詳細一點爲:
Android Studio默認使用Lambda表達式是會報錯的,即使你使用的是java 8,爲了在android studio中使用lambda表達式,我們必須藉助一個插件retrolambda ,該插件將java 8中的lambda表達式特性兼容到java 5。使用它也很簡單。
首先先項目根目錄下的build.gradle中加入
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
最終整個文件會像這樣子
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
然後再module目錄下的build.gradle中使用插件,加入
apply plugin: 'me.tatarka.retrolambda'
並且在android節點下加入
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
最終整個文件就像這樣子
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion 22.0.1
defaultConfig {
applicationId cn.edu.zafu.rxdemo
minSdkVersion 15
targetSdkVersion 22
versionCode 1
versionName 1.0
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
現在讓我們試試lambda表達式,就拿View的點擊事件做實驗吧。
在使用lambda表達式之前是這樣子的
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(), test, Toast.LENGTH_LONG).show()
}
});
使用了lambda表達式之後是這樣子的
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(v -> Toast.makeText(getApplicationContext(), test, Toast.LENGTH_LONG).show()
);
好了,運行一下項目,如果點擊按鈕出現了Toast說明你成功了,但是如果你運行出現ClassNotFound的錯誤的話clean一下項目,再編譯運行,就能成功運行了。
怎麼樣,有沒有發現代碼精簡了許多。這篇文章算是開始RxJava(RxAndroid)的學習之路的第一篇博文吧,畢竟RxJava大量使用了lambda表達式特性。雖然也可以不用lambda表達式,但是使用了lambda表達式後會顯得代碼特別精簡。