在Android上使用Lambda運算式 - retrolambda外掛程式

來源:互聯網
上載者:User

標籤:

Update: Android Jack編譯工具的加入使得我們可以在舊平台上也使用Lambda運算式了,最重要這是官方支援哦,具體內容看我的這篇:《在Android上使用官方Lambda支援 - Android N & Jack工具(相容舊平台)》

Java8比較大的一個變化是加入了Lambda運算式,一種緊湊的,傳遞行為的方式。它可以使你的代碼更簡潔、邏輯更清晰。特別是用Rxjava的時候,將各種資料變換使用Lambda運算式來簡化,可以最大化的減少樣板代碼,使整個資料流的處理邏輯十分清晰(下面會有個例子)。

retrolambda又是什麼呢?它是 Java 5/6/7 中對Java8 Lambda 運算式的非官方相容方案。因為目前Android的所有版本(除了N Preview),都還不支援java8。

Github上搜尋retrolambda,前兩個最多星的就是我們的目標了。分別是evant/gradle-retrolambda和orfjackal/retrolambda。他們之間是啥關係呢?簡單來說,gradle-retrolambda只是AS的一個gradle外掛程式,他裡面也依賴第二個開源庫orfjackal/retrolambda。所以這裡我們直接選第一個進行配置。

  • Step1
    下載jdk8(可以與jdk7並存)
  • Step2
    修改系統內容變數,設定好JAVA7_HOMEJAVA8_HOME(為了方便下面外掛程式的配置)
  • Step3
    修改build.gradle檔案,加入以下構建指令碼即可(詳見:README):
apply plugin: ‘me.tatarka.retrolambda‘buildscript {  repositories {     mavenCentral()  }  dependencies {     classpath ‘me.tatarka:gradle-retrolambda:3.2.5‘  }}retrolambda {    jdk System.getenv("JAVA8_HOME")    oldJdk System.getenv("JAVA7_HOME")    javaVersion JavaVersion.VERSION_1_7}android {    ...    compileOptions {        sourceCompatibility JavaVersion.VERSION_1_8        targetCompatibility JavaVersion.VERSION_1_8    }}

(注意:若你使用的gradle plugins版本是2.0.0,你應該使用最新的3.3.0-beta4 gradle-retrolambda外掛程式。)

  • Step4
    項目預設是依賴v2.1.0版本的retrolambda庫,你可以手動更改此依賴(如修改為最新的2.3.0版本,如果不想修改可以直接跳過這步):
dependencies {  // Latest version 2.3.0  retrolambdaConfig ‘net.orfjackal.retrolambda:retrolambda:2.3.0‘  // Or a local version  // retrolambdaConfig files(‘libs/retrolambda.jar‘)}
  • Step5
    執行Gradle Sync Project,稍等AS下載好相關外掛程式及依賴庫,就可以開始寫Lambda運算式了。下面是一個簡單的例子,分別是加入Lambda運算式前後的對比,大家隨意感受一下:

沒有使用Lambda運算式:

Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))    .filter(new Func1<Integer, Boolean>() {        @Override        public Boolean call(Integer integer) {            return integer % 2 == 0;        }    })    .map(new Func1<Integer, Integer>() {        @Override        public Integer call(Integer integer) {            return integer * integer;        }    })    .subscribeOn(Schedulers.io())    .observeOn(AndroidSchedulers.mainThread())    .subscribe(new Action1<Integer>() {        @Override        public void call(Integer integer) {            System.out.println(integer);        }    });

加入Lambda運算式後:

Observable.from(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))    .filter(integer -> integer % 2 == 0)    .map(integer -> integer * integer)    .subscribeOn(Schedulers.io())    .observeOn(AndroidSchedulers.mainThread())    .subscribe(integer -> System.out.println(integer));

是不是感覺代碼更加清爽、樣板代碼更少、整個資料的處理邏輯更加清晰了?Lambda運算式的文法也不多,學習成本較少,還沒嘗試的童鞋可以匯入到項目裡面耍耍了。

在Android上使用Lambda運算式 - retrolambda外掛程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.