Android開發學習之路--RxAndroid之lambda

來源:互聯網
上載者:User

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() {            @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); }() -> 42a  -> 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 func03-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 testFunctionLambda03-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了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.