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的更多相关文章

  1. Android开发学习之路--RxAndroid之简单原理

      学习了RxAndroid,其实也就是RxJava了,但是还是不是非常清楚到底RxAndroid有什么用呢?为什么要使用RxAndroid呢?这篇文章讲得不错,RxJava的原理.但是这里还是把整个 ...

  2. Android开发学习之路--RxAndroid之初体验

    学了一段时间android,看了部分的项目代码,然后想想老是学基础也够枯燥乏味的,那么就来学习学习新东西吧,相信很多学java的都听说过RxJava,那么android下也有RxAndroid. Rx ...

  3. Android开发学习之路--RxAndroid之操作符

      学习了RxAndroid的一些基本知识,上篇文章也试过了RxAndroid的map操作符,接着来学习更多的操作符的功能吧.   操作符就是为了解决对Observable对象的变换的问题,操作符用于 ...

  4. Android开发学习之路-RecyclerView滑动删除和拖动排序

    Android开发学习之路-RecyclerView使用初探 Android开发学习之路-RecyclerView的Item自定义动画及DefaultItemAnimator源码分析 Android开 ...

  5. Android开发学习之路--基于vitamio的视频播放器(二)

      终于把该忙的事情都忙得差不多了,接下来又可以开始good good study,day day up了.在Android开发学习之路–基于vitamio的视频播放器(一)中,主要讲了播放器的界面的 ...

  6. Android开发学习之路--Android Studio cmake编译ffmpeg

      最新的android studio2.2引入了cmake可以很好地实现ndk的编写.这里使用最新的方式,对于以前的android下的ndk编译什么的可以参考之前的文章:Android开发学习之路– ...

  7. Android开发学习之路--网络编程之xml、json

    一般网络数据通过http来get,post,那么其中的数据不可能杂乱无章,比如我要post一段数据,肯定是要有一定的格式,协议的.常用的就是xml和json了.在此先要搭建个简单的服务器吧,首先呢下载 ...

  8. Android开发学习之路--Activity之初体验

    环境也搭建好了,android系统也基本了解了,那么接下来就可以开始学习android开发了,相信这么学下去肯定可以把android开发学习好的,再加上时而再温故下linux下的知识,看看androi ...

  9. Android开发学习之路--Android系统架构初探

    环境搭建好了,最简单的app也运行过了,那么app到底是怎么运行在手机上的,手机又到底怎么能运行这些应用,一堆的电子元器件最后可以运行这么美妙的界面,在此还是需要好好研究研究.这里从芯片及硬件模块-& ...

随机推荐

  1. DP测试总结

    T1:三取方格数 题目描述 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0.某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角.在走过的路上,他取走了方格中的数. ...

  2. [UOJ UNR #2]积劳成疾

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 区间最大值的题emmmm 想到构建笛卡尔树,这样自然就想到了一种dp f[i][j]表示大小为i的笛卡尔树,根的权值是j的答案. 转移 ...

  3. [bzoj4763]雪辉&[bzoj4812][Ynoi2017]由乃打扑克

    来自FallDream的博客,未经允许,请勿转载,谢谢. cut掉部分题面. 给一个n个点的树,点有点权,有m次询问,每次询问多条链的并有多少种不同的点权以及它的mex mex就是一个集合中最小的没有 ...

  4. http协议无状态中的 "状态" 到底指的是什么?!

    引子: 最近在好好了解http,发现对介绍http的第一句话[http协议是无状态的,无连接的]就无法理解了:无状态的[状态]到底指的是什么?! 找了很多资料不仅没有发现有一针见血正面回答这个问题的, ...

  5. (转载)JVM知识小集

    1. 内存模型以及分区,需要详细到每个区放什么. 2. 堆里面的分区:Eden,survival from to,老年代,各自的特点. 3. 对象创建方法,对象的内存分配,对象的访问定位. 4. GC ...

  6. Uncaught (in promise) TypeError:的错误

    1.错误 创建一个vue实例,在data定义一些变量,如activityTime. 在methods里面用了axios发送请求. 在then的回调里使用this.activityTime 报错! 2. ...

  7. The specified JRE installation does not exist异常的原因和解决办法

    今天,回首为了学习新框架,于是将JDK的版本从1.7开发标配版换成了1.8,一切前期很顺利,完成了新框架的测试和体验,但在运行原有项目的时候问题出现了,爆出了The specified JRE ins ...

  8. swing JTable 更新数据

    rowData 是将要更新的表格内数据,coloumnName是将要更新的表头数据. table是原本的table对象,更新数据的时候要用 DefaultTableModel 类~ /*更新table ...

  9. Docker常见仓库WordPress

    WordPress 基本信息 WordPress 是开源的 Blog 和内容管理系统框架,它基于 PhP 和 MySQL. 该仓库提供了 WordPress 4.0 版本的镜像. 使用方法 启动容器需 ...

  10. fatal error C1083: Cannot open precompiled header file: 'Debug/xxoo.pch': No such file or directory

    fatal error C1083: Cannot open precompiled header file: 'Debug/xxoo.pch': No such file or directory ...