Java 8推出已經將近2年多了,引入不少革命性變化,加入了函數式編程的特徵,使基於行爲的編程成爲可能,同時減化了各類設計模式的實現方式,是Java有史以來最重要的更新。可是Android上,一直沒有看到支持Java8的消息。Android到底會不會支持Java8呢?答案是確定的,Android N已經開始支持Java 8 了。java
Java 8的一大亮點是引入Lambda表達式,使用它設計的代碼會更加簡潔。當開發者在編寫Lambda表達式時,也會隨之被編譯成一個函數式接口。android
android {
...
defaultConfig {
...
jackOptions {
enabled true
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
我這裏使用的Android studio 2.2.2版本 Android版本爲24,若是是低於24版本的話是沒法使用Java 8特性的。若是僅僅只想使用lambda表達式的話徹底夠用了,咱們只需把minSdkVersion設爲14便可。web
如下是我本身的設置範例express
android {
compileSdkVersion 24
buildToolsVersion '24.0.2'
defaultConfig {
applicationId "com.whoislcj.jsbridge"
minSdkVersion 14
targetSdkVersion 24
versionCode 1
versionName "1.0"
jackOptions {
enabled true
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
dexOptions {
incremental true
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
productFlavors {
}
}
「Lambda 表達式」(lambda expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式能夠表示閉包(注意和數學傳統意義上的不一樣)。編程
這裏以常見的Java匿名內部類爲例設計模式
(1.)未使用lambda表達式以前閉包
1 findViewById(R.id.to_web).setOnClickListener(new View.OnClickListener() { 2 @Override 3 public void onClick(View v) { 4 Toast.makeText(MainActivity.this, "終於等到你", Toast.LENGTH_LONG).show(); 5 } 6 });
(2.)使用lambda表達式
1 findViewById(R.id.to_web).setOnClickListener((View v) -> { 2 Toast.makeText(this, "終於等到你", Toast.LENGTH_LONG).show(); 3 });
(3.)進一步簡化
1 findViewById(R.id.to_web).setOnClickListener(v -> Toast.makeText(this, "終於等到你", Toast.LENGTH_LONG).show());
在Android studio 2.1 版本要想實現Lambda表達式的話能夠採用第三方AS retrolambda插件來實現,github地址:https://github.com/evant/gradle-retrolambda,一樣那種方式僅僅支持lambda表達式而不支持Java8特性。
1.)中文亂碼問題
這個問題我一直覺得是編碼問題,後來才發現是jackOptions {enabled true}引發的中文亂碼,解決辦法在project的gradle.properties中添加以下代碼
org.gradle.jvmargs=-Dfile.encoding=UTF-8
2.)Instant Run 目前不能用於 Jack,目前建議暫時關閉Instant Run使用。
本文僅僅是學習瞭如何使用在Android 開發中使用Java8的lambda表達式來使代碼變得簡潔,借來會逐步對Java的一些特性進行學習。