1. lambda表达式在android中的妙用
@[toc]
::输出的时候使用
-> 传递值的时候使用
对应lambda
x -> body
对应lambda
(x, y) -> x + y;
对应lambda
(int x, int y) -> x + y;
() -> {}
(x, y) -> x + y;
3)单行需要有返回值
(x, y) -> x + y//注意没有分号结尾
(x, y) ->{
x x;
y y;
}
(x, y) ->{
x x;
y y;
return x + y;
}
(1)list在forEach中使用lambda
(2)map在forEach中使用lambda
2. android如何使用lambda表达式
在java8之前,Java并不支持Lambda表达式,而Android目前最新也才支持到Java7特性,所以在Android中使用Lambda表达式需要进行一些处理,将Lambda表达式编译成Android可以“理解”的方式。
Retrolambda是一个能够让我们在Java7中使用Lambda的工具,再通过gradle-retrolambda插件,在gradle编译过程中将会:
将Java8中的 javac编译 Java8的代码;
将产生的Java8的字节码转换为Java6的字节码;
重新打包class。
build.gradle配置文件如下:
buildscript {
repositories {
mavenCentral()
maven {
url "https://oss.sonatype.org/content/repositories/snapshots"
}
}
dependencies {
classpath 'me.tatarka:gradle-retrolambda:1.2.+'
}
}
// Required because retrolambda is on maven central
repositories {
mavenCentral()
}
apply plugin: 'android'
apply plugin: 'retrolambda'
也可以添加如下设置:
retrolambda {
jdk System.getenv("JAVA8_HOME")
javaVersion JavaVersion.VERSION_1_6
}
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
从此以后,
strings.map(new Func1<String, Integer>() {
@Override
public Integer call(String s) {
return s.length();
}
});
可以写作:
strings.map((String s) -> {
return s.length();
});
至于详细的bytecode转换过程,有兴趣的同志们可以自己研究研究。
3. 如何Android Studio里使用lambda表达式
Lambda表达式是在JDK8中开始支持的一种函数式推导语言,能够大量减少匿名内部类那种冗余的代码。在Android中,可以大量使用在设置监听,设置异步回调等场景。
目前Android开发已经渐渐到从Eclipse的ADT迁移到了AndroidStudio,但是AndroidStudio目前的版本还没有直接支持Lambda表达式的支持,需要插件支持,当然,JDK版本也必须使用JDK8或者以上(当然过些时间会有更高版本的JDK)。
1.引入retrolambda插件:
在Project的build.gradle中添加
applyplugin:‘me.tatarka.retrolambda‘
2.设置编译选项(可能也可以不写)
在Project的build.gradle的android节点中添加如下代码
compileOptions{
.VERSION_1_8
.VERSION_1_8
}
3.引入retrolambda的类路径,在Mole:app的build.gradle中的buildscript->dependencies节点中添加如下代码
classpath‘me.tatarka:gradle-retrolambda:3.2.0‘
4.对build.gradle进行build
5.编写测试代码,简单写法如下
[java]viewplain
protectedvoidonCreate(BundlesavedInstanceState){
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.运行查看是否正常
详细一点为:
AndroidStudio默认使用Lambda表达式是会报错的,即使你使用的是Java8,为了在androidstudio中使用lambda表达式,我们必须借助一个插件retrolambda,该插件将Java8中的lambda表达式特性兼容到java5。使用它也很简单。
首先先项目根目录下的build.gradle中加入
[java]viewplain
<codeclass="hljs">classpath'me.tatarka:gradle-retrolambda:3.2.0'</code>
最终整个文件会像这样子
[java]viewplain
<codeclass="hljs">buildscript{
repositories{
jcenter()
}
dependencies{
classpath'com.android.tools.build:gradle:1.2.3'
classpath'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects{
repositories{
jcenter()
}
}
</code>
然后再mole目录下的build.gradle中使用插件,加入
[java]viewplain
<codeclass="hljs">applyplugin:'me.tatarka.retrolambda'</code>
并且在android节点下加入
[java]viewplain
<codeclass="hljs">compileOptions{
sourceCompatibility<atarget="_blank"href="
(51,51,51);text-decoration:none;font-size:14px;background:none">Java</a>Version.VERSION_1_8
.VERSION_1_8
}</code>
最终整个文件就像这样子
[java]viewplain
<codeclass="hljs">applyplugin:'com.android.application'
applyplugin:'me.tatarka.retrolambda'
android{
compileSdkVersion22
buildToolsVersion22.0.1
defaultConfig{
applicationIdcn.e.zafu.rxdemo
minSdkVersion15
targetSdkVersion22
versionCode1
versionName1.0
}
buildTypes{
release{
minifyEnabledfalse
('proguard-android.txt'),'proguard-rules.pro'
}
}
compileOptions{
.VERSION_1_8
.VERSION_1_8
}
}
dependencies{
compilefileTree(dir:'libs',include:['*.jar'])
compile'com.android.support:appcompat-v7:22.2.0'
}
</code>
现在让我们试试lambda表达式,就拿View的点击事件做实验吧。
在使用lambda表达式之前是这样子的
[java]viewplain
<codeclass="hljs">btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show()
}
});</code>
使用了lambda表达式之后是这样子的
[java]viewplain
<codeclass="hljs">btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(v->Toast.makeText(getApplicationContext(),test,Toast.LENGTH_LONG).show()
);</code>
好了,运行一下项目,如果点击按钮出现了Toast说明你成功了,但是如果你运行出现ClassNotFound的错误的话clean一下项目,再编译运行,就能成功运行了。
怎么样,有没有发现代码精简了许多。这篇文章算是开始RxJava(RxAndroid)的学习之路的第一篇博文吧,毕竟RxJava大量使用了lambda表达式特性。虽然也可以不用lambda表达式,但是使用了lambda表达式后会显得代码特别精简。
来自zzh1026it的博客分享
4. 如何Android Studio里使用lambda表达式
Android Studio默认使用Lambda表达式是会报错的,即使你使用的是Java 8,为了在android studio中使用lambda表达式,我们必须借助一个插件retrolambda ,该插件将Java 8中的lambda表达式特性兼容到java 5。使用它也很简单。
首先先项目根目录下的build.gradle中加入
classpath 'me.tatarka:gradle-retrolambda:3.2.0'11
最终整个文件会像这样子
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
}
}
allprojects {
repositories {
jcenter()
}
}
然后再mole目录下的build.gradle中使用插件,加入
apply plugin: 'me.tatarka.retrolambda'11
并且在android节点下加入
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}12341234
最终整个文件就像这样子
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "cn.e.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()
}
});12345671234567
使用了lambda表达式之后是这样子的
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(v -> Toast.makeText(getApplicationContext(), "test", Toast.LENGTH_LONG).show()
);123123
好了,运行一下项目,如果点击按钮出现了Toast说明你成功了,但是如果你运行出现ClassNotFound的错误的话clean一下项目,再编译运行,就能成功运行了。
例子、源码、文档全部搞定,采用androidstudo的目录结构,360手机助手中下载。下面是截图。
5. Android studio中怎么操作lambda
首先明确lambda表达式他是一个匿名函数,通常可以表示闭包。在Android studio中操作lambda表达式主要有以下几步:
在Gradle(Project)中添加:(classpath:classpath 'me.tatarka:gradle-retrolambda:3.2.0')如图所示:
6. 如何Android Studio里使用lambda表达式
Lambda表达式是Java 8的一个新特性,可以替代只有一个函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合的迭代、遍历、过滤数据的操作。那么在Android Studio中如何使用lambda表达式呢?
项目使用的jdk要为jdk 8或更高版本
然后在项目中就可以愉快使用lambda表达式了,大家感受下:
public class TestActivity extends BaseActivity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.test);
findViewById(R.id.button1).setOnClickListener(view -> onButton1());
findViewById(R.id.button2).setOnClickListener(view -> onButton2());
} public void onButton1() {
Runnable runnable = () -> Toast.makeText(this, "abcd", Toast.LENGTH_SHORT).show();
runnable.run();
} public void onButton2() {
Observable.from(Arrays.asList(1, 2, 3, 4, 5))
.filter(integer -> integer % 2 == 0)
.map(integer -> integer * integer)
.subscribeOn(Schelers.io())
.observeOn(AndroidSchelers.mainThread())
.subscribe(integer -> Toast.makeText(this, String.valueOf(integer), Toast.LENGTH_SHORT).show());
}
}