Android开发学习之路--RxAndroid之lambda
RxJava的简单使用基本上也了解了,其实还有一个比较好玩的就是java8才有的lambda了。
lambda在android studio下的环境搭建
下载java8
下面就来搭建下这个环境了,因为android不支持java8,所以需要用到一个开源库, retolambda,点这里。具体怎么使用基本上都有,这里简单地介绍下,首先就是下载java8了:下载java8,点这里。
修改配置工程文件
下载好安装好后,需要修改build.gradle:
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:1.5.0'
classpath 'me.tatarka:gradle-retrolambda:3.2.0'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
这里添加了me.tatarka:gradle-retrolambda:3.2.0。
接着是 app目录下的build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
defaultConfig {
applicationId "com.jared.emrxandroidstudy"
minSdkVersion 15
targetSdkVersion 23
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'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'io.reactivex:rxandroid:1.1.0'
compile 'io.reactivex:rxjava:1.1.0'
}
修改工程的jdk版本
添加完后需要修改编译的jdk为java8:
lambda在RxAndroid中简单使用
修改完后,重新启动下工程,然后我们开始基于上一篇的文章继续了。这里对上一篇文章的代码通过lambda简化:
private void createObservableByMap() {
Log.d(TAG, "createObservableByMap");
Observable.just(getHello()).map(new Func1<String, String>() {
@Override
public String call(String s) {
return s + " by eastmoon";
}
}).subscribe(onNextAction);
}
onNextAction = new Action1<String>() {
@Override
public void call(String s) {
mHello.setText(s);
}
};
简化后如下所示:
private void createObservableBylambda() {
Log.d(TAG, "createObservableBylambda");
Observable.just(getHello())
.map(s -> s + " by eastmoon")
.subscribe(s -> mHello.setText(s));
}
是不是非常清晰,非常的简洁优雅,这里先不分析。
lambda表达式简介
lambda简单介绍及例子
简单理解下lambda吧,lambda是一种匿名表达式,关于lambda表达式这篇文章讲得不错:讲lambda比较好的文章。这里还是记录下当作学习吧,首先lambda的表达式一般是:
(argument) -> (body)
其中argument表示参数,body表示函数体要做的事。常用的表达式如下:
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }
具体一些是这样:
(int a, int b) -> { return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
a -> a + 5
() -> { return 3.1415 };
函数式接口简单介绍
通过上述例子,基本上也理解了表达式怎么用了。那么什么情况下可以使用lambda表达式呢?这里有个函数式接口的概念,函数式接口就是指只包含一个抽象方法声明的接口。Runnable只有一个接口run,所以它可以用lambda表达式实现。普通的方式如下:
Runnable r1 = new Runnable() {
@Override
public void run() {
Log.d(TAG, "testlambda");
}
};
使用lambda表达式如下:
Runnable r2 = () -> Log.d(TAG, "testlambda");
从六行代码搞到了一行代码,是不是超级简洁优雅。来个例子试试水吧:
private void testlambda() {
new Thread(new Runnable() {
@Override
public void run() {
Log.d(TAG, "test by normal func");
}
}).start();
new Thread(() -> Log.d(TAG, "test by lambda func")).start();
}
这里通过创建线程在run方法中输出信息,可以看出两种效果一模一样:
03-11 09:18:39.453 27601-28067/? D/MainActivity: test by lambda func
03-11 09:18:39.453 27601-28066/? D/MainActivity: test by normal func
函数式接口地简单实现
既然需要函数式接口,那么我们来简单的实现下函数式接口,新建FunctionLambda接口:
package com.jared.emrxandroidstudy;
/**
* Created by jared on 16/3/11.
*/
public interface FunctionLambda {
public void hello();
}
接着编写类FunctionLambdaTest:
package com.jared.emrxandroidstudy;
/**
* Created by jared on 16/3/11.
*/
public class FunctionLambdaTest {
public static void helloTest(FunctionLambda functionLambda) {
functionLambda.hello();
}
}
接着我们来实现下这个功能:
private void testFunctionLambda() {
FunctionLambdaTest.helloTest(new FunctionLambda() {
@Override
public void hello() {
Log.d(TAG, "test by normal testFunctionLambda");
}
});
FunctionLambdaTest.helloTest(() -> Log.d(TAG, "test by lambda testFunctionLambda"));
}
输出信息如下:
03-11 09:30:29.005 28776-28776/? D/MainActivity: test by normal testFunctionLambda
03-11 09:30:29.005 28776-28776/? D/MainActivity: test by lambda testFunctionLambda
效果一模一样,代码精简的不要不要的。
lambda在RxAndroid中的使用分析
好了,讲了这么多lambda表达式,还是看看rxAndroid用到的那个例子吧。这里再添下代码:
private void createObservableBylambda() {
Log.d(TAG, "createObservableBylambda");
Observable.just(getHello())
.map(s -> s + " by eastmoon")
.subscribe(s -> mHello.setText(s));
}
首先是map方法,因为map方法中重写了call方法,传入的参数为s,函数体里面要做的事情是s+” by eastmoon”,所以就写成了s -> s+” by eastmoon”,由这可知就是s变为了s+” by eastmoon”。同理subscribe方法也一样,传入的需要处理的mHello.setText(s)。
基本上lambda的简单使用ok了,接下去继续学习RxAndroid了。
Android开发学习之路--RxAndroid之lambda的更多相关文章
- Android开发学习之路--RxAndroid之简单原理
学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...
- Android开发学习之路--RxAndroid之初体验
学了一段时间android,看了部分的项目代码,然后想想老是学基础也够枯燥乏味的,那么就来学习学习新东西吧,相信很多学java的都听说过RxJava,那么android下也有RxAndroid. Rx ...
- Android开发学习之路--RxAndroid之操作符
学习了RxAndroid的一些基本知识,上篇文章也试过了RxAndroid的map操作符,接着来学习更多的操作符的功能吧. 操作符就是为了解决对Observable对象的变换的问题,操作符用于 ...
- Android开发学习之路-RecyclerView滑动删除和拖动排序
Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...
- Android开发学习之路--基于vitamio的视频播放器(二)
终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...
- Android开发学习之路--Android Studio cmake编译ffmpeg
最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...
- Android开发学习之路--网络编程之xml、json
一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...
- Android开发学习之路--Activity之初体验
环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...
- Android开发学习之路--Android系统架构初探
环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...
随机推荐
- ●BZOJ 2694 Lcm
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2694 题解: 莫比乌斯反演 不难看出,造成贡献的(i,j)满足gcd(i,j)无平方因子. ...
- ●UVA 10674 Tangents
题链: https://vjudge.net/problem/UVA-10674 题解: 计算几何,求两个圆的公切线. <算法竞赛入门经典——训练指南>P266,讲得很清楚的. 大致是分为 ...
- bzoj2237[NCPC2009]Flight Planning 结论题?
2237: [NCPC2009]Flight Planning Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 55 Solved: 27[Submi ...
- [bzoj4813][Cqoi2017]小Q的棋盘
来自FallDream的博客,未经允许,请勿转载,谢谢. 小Q正在设计一种棋类游戏.在小Q设计的游戏中,棋子可以放在棋盘上的格点中.某些格点之间有连线,棋子只能在有连线的格点之间移动.整个棋盘上共有V ...
- quartzJob 例子
KpiOfPoorQualityJob.javapackage com.eastcom_sw.inas.workorder.quartzJob.kpi; import net.sf.json.JSON ...
- 如何让Mac、Windows可以互相远程
您可以通过Mac来远程Windows桌面:也可通过Windows来远程Mac界面:甚至还可以通过iOS或Android来远程Mac或Windows. Windows的操作方法,以Windows XP ...
- Python中高阶函数讲解
高阶函数讲解 1. 常规高阶函数 递归函数 格式:def func_name(variable): '''__doc__'''#函数的说明文档 if 条件表达式:#限制递归退出值 pass retur ...
- Tomcat和JDK的内存配置
1.jvm内存管理机制: 1)堆(Heap)和非堆(Non-heap)内存 按照官方的说法:"Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配.堆是在 Ja ...
- jQuery 安装
网页中添加 jQuery 可以通过多种方法在网页中添加 jQuery. 您可以使用以下方法: 从 jquery.com 下载 jQuery 库 从 CDN 中载入 jQuery, 如从 Google ...
- 20160210.CCPP体系详解(0020天)
程序片段(01):01.二级指针.c 内容概要:二级指针 #include <stdio.h> #include <stdlib.h> //01.二级指针: // 1.使用场景 ...