• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >Android > Android开发学习之路--RxAndroid之lambda

Android开发学习之路--RxAndroid之lambda

作者:网友 字体:[增加 减小] 来源:互联网 时间:2017-05-26

网友通过本文主要向大家介绍了Android开发学习之路--RxAndroid之lambda等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

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:

</div>

lambda在RxAndroid中简单使用

修改完后,重新启动下工程,然后我们开始基于上一篇的文章继续了。这里对上一篇文章的代码通过lambda简化:

private void createObservableByMap() {
        Log.d(TAG, "createObservableByMap");
        Observable.just(getHello()).map(new Func1() {
            @Override
            public String call(String s) {
                return s + " by eastmoon";
            }
        }).subscribe(onNextAction);
    }

onNextAction = new Action1() {
            @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”,所以

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-05-26Android 模仿发说说
  • 2017-05-26Hive 1.2.1&Spark&Sqoop安装指南
  • 2017-05-26FlatBuffers初探,flatbuffers
  • 2017-05-26Android Studio发布应用
  • 2017-05-26关于eclipse android 在manifest改app应用包名注意事项,androidmanifest
  • 2017-05-26Android入门——Drawable与对应的资源xml的应用
  • 2017-05-26lua中使用luasocket通信,写了一个简单的事件库
  • 2017-05-26arcgis andriod 加载影像,arcgisandriod
  • 2017-05-26Android安全机制
  • 2017-05-26Android7.0 Phone应用源码分析(三) phone拒接流程分析,android7.0拒接

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 算法导论--广度优先搜索和深度优先搜索,导论深度优先搜索
    • redis集群部署以及一些坑
    • Android开发重点难点1:RelativeLayout(相对布局)详解,
    • 读《重构手册》-重构之姊妹篇有感,《重构手册》姊妹篇
    • AsyncTask.cancel()的结束问题,asynctaskcancel
    • mysql字符集乱码问题
    • 自定义控件添加自定义属性问题,控件添加自定义属性
    • android插件开发-就是你了!启动吧!插件的activity(一)
    • Android之SharedPreferences数据存储,sharedpreferences
    • Android之网络数据存储,android数据存储

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有