標籤:
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_HOME和JAVA8_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外掛程式