Android Studio中如何支持使用Lambda表達(dá)式

Java8引入了lambda表達(dá)式,Lambda 表達(dá)式”(lambda expression)是一個(gè)匿名函數(shù),本質(zhì)上就是可以傳遞給其他函數(shù)的一小段代碼。

下面來看一下如何讓自己的項(xiàng)目支持使用lambda表達(dá)式,以達(dá)到簡(jiǎn)化代碼的目的。
先來舉個(gè)栗子,看看我們平常寫點(diǎn)擊事件是如何寫的

普通寫法:
  tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                  //處理邏輯
            }
        });
Lambda表達(dá)式寫法
  tv.setOnClickListener(v->Toast.makeText(this,"this is lambda",Toast.LENGTH_SHORT).show());

是不是代碼變得簡(jiǎn)潔了很多。
下面就介紹一下使用Android studio 3.0.1新建項(xiàng)目,配置支持Lambda表達(dá)式。
gradle android插件版本為:classpath 'com.android.tools.build:gradle:3.0.1'

可能有以下三種情形:

(1)集成了Kotlin環(huán)境,但項(xiàng)目是混合開發(fā)的,.java和.kt的代碼都有。

此時(shí),在.kt的代碼中可以直接使用lambda表達(dá)式,而在java代碼中,如果直接使用的話,會(huì)報(bào)如下提示
Lambda expressions are not supported at this language level


image.png

此時(shí),我們只需要在app的build.gradle中的android{ }內(nèi)添加如下配置即可。

    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
(2)純Kotlin開發(fā)環(huán)境,只在Kotlin代碼中使用lambda表達(dá)式

Kotlin標(biāo)準(zhǔn)庫大量的使用了lambda表達(dá)式,所以在Kotlin代碼中可以直接使用。只要有Kotlin環(huán)境的基本配置即可。

 button.setOnClickListener { v -> Toast.makeText(applicationContext,"this is lambda",Toast.LENGTH_SHORT).show() }
(3)純Java代碼開發(fā)環(huán)境,沒有引入Kotlin支持庫。

也只需要在app的build.gradle中的android{ }內(nèi)添加如下配置即可。

    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }

綜上,正常情況下,其實(shí)要支持lambda,只要添加上面compileOptions 的配置就行了。

配置到我自己的項(xiàng)目

我也是在app.build中添加:

    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }

很簡(jiǎn)單吧,但是當(dāng)我配置到我自己項(xiàng)目的時(shí)候,居然?。?!出錯(cuò)了.......竟然如此尷尬......
(我項(xiàng)目的gradle插件版本是: classpath 'com.android.tools.build:gradle:2.2.2' ,項(xiàng)目配置了Kotlin環(huán)境,Kotlin版本是: ext.kotlin_version = '1.2.10' 的)


image.png

編譯報(bào)錯(cuò):Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.

image.png

于是我搜索了一下解決辦法,說是在app.build中加入jackOptions 中就行了。

defaultConfig {
        jackOptions {
            enabled true
        }
    }

同步了一下,結(jié)果.....并沒有成功!報(bào)下面的錯(cuò)誤:
Kotlin Gradle plugin does not support the deprecated Jack toolchain.Disable Jack or revert to Kotlin Gradle plugin version 1.1.1.


image.png

遇到這種工程構(gòu)建的錯(cuò)誤,確實(shí)是挺煩人的,但是大家一定要有耐心,仔細(xì)查錯(cuò),不要著急。
按照上面提示:Kotlin版本不支持配置jackOptions ,要我把版本Kotlin改成1.1.1。OK,那就把Kotlin版本改成1.1.1咯,同步一下,OK。但是發(fā)現(xiàn)這樣的方式,導(dǎo)致項(xiàng)目構(gòu)建很慢,于是乎又找了另外一種方法配置。

簡(jiǎn)單一步到位的配置支持Lambda

針對(duì)我的項(xiàng)目從頭開始,手動(dòng)去添加支持lambda的插件,也是OK的,這樣一步到位,不會(huì)出錯(cuò),完整的配置為:
工程的build.gradle中添加

      dependencies {
        classpath 'com.android.tools.build:gradle:2.2.2'
        //classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
        //java中支持lambda
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
    }

app.gradle中添加

//apply plugin: 'android-apt'
//java中支持lambda
apply plugin: 'me.tatarka.retrolambda'
android{

    compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
}

搞定!?。?android-apt插件可配可不配都行)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容