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的一些特性进行学习。