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表达式后会显得代码特别精简。