前言:
Java 8推出已經將近2年多了,引入很多革命性變化,加入了函數語言程式設計的特徵,使基於行為的程式設計成為可能,同時減化了各種設計模式的實現方式,是Java有史以來最重要的更新。但是Android上,一直沒有看到支援Java8的訊息。Android到底會不會支援Java8呢?答案是肯定的,Android N已經開始支援Java 8 了。
關於Java 8
(1.)使用Lambda表示式
Java 8的一大亮點是引入Lambda表示式,使用它設計的程式碼會更加簡潔。當開發者在編寫Lambda表示式時,也會隨之被編譯成一個函式式介面。
(2.)引入函式式介面
1.)第一步,安裝Java8,並指定專案使用Java8,minSdkVersion <24 只能使用Java8 的 Lambda特性,minSdkVersion>= 24可以使用Java8特性,由此可見全部普及Java8還是需要一定時間的
2.)第二步在module的build.gradle中新增相關配置
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即可。
以下是我自己的設定範例
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 表示式”(lambda expression)是一個匿名函式,Lambda表示式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函式,即沒有函式名的函式。Lambda表示式可以表示閉包(注意和數學傳統意義上的不同)。
如何使用Java 8 Lambda表示式?
1.)使用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());
2.)擴充套件知識
在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的一些特性進行學習。