天天看點

Android Studio中如何支援使用Lambda表達式

Java8引入了lambda表達式,Lambda 表達式”(lambda expression)是一個 匿名函數

,本質上就是可以傳遞給其他函數的一小段代碼。

下面來看一下如何讓自己的項目支援使用lambda表達式,以達到簡化代碼的目的。

先來舉個栗子,看看我們平常寫點選事件是如何寫的

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

是不是代碼變得簡潔了很多。

下面就介紹一下使用Android studio 3.0.1建立項目,配置支援Lambda表達式。

gradle android插件版本為:classpath 'com.android.tools.build:gradle:3.0.1'

可能有以下三種情形:

(1)內建了Kotlin環境,但項目是混合開發的,.java和.kt的代碼都有。

此時,在.kt的代碼中可以直接使用lambda表達式,而在java代碼中,如果直接使用的話,會報如下提示

Lambda expressions are not supported at this language level

Android Studio中如何支援使用Lambda表達式

image.png

此時,我們隻需要在app的build.gradle中的android{ }内添加如下配置即可。

compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
           
(2)純Kotlin開發環境,隻在Kotlin代碼中使用lambda表達式

Kotlin标準庫大量的使用了lambda表達式,是以在Kotlin代碼中可以直接使用。隻要有Kotlin環境的基本配置即可。

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

也隻需要在app的build.gradle中的android{ }内添加如下配置即可。

compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
           

綜上,正常情況下,其實要支援lambda,隻要添加上面compileOptions 的配置就行了。

配置到我自己的項目

我也是在app.build中添加:

compileOptions {
        targetCompatibility 1.8
        sourceCompatibility 1.8
    }
           

很簡單吧,但是當我配置到我自己項目的時候,居然!!!出錯了.......竟然如此尴尬......

(我項目的gradle插件版本是: classpath 'com.android.tools.build:gradle:2.2.2' ,項目配置了Kotlin環境,Kotlin版本是: ext.kotlin_version = '1.2.10' 的)

Android Studio中如何支援使用Lambda表達式

編譯報錯:Error:Jack is required to support java 8 language features. Either enable Jack or remove sourceCompatibility JavaVersion.VERSION_1_8.

Android Studio中如何支援使用Lambda表達式

于是我搜尋了一下

解決辦法

,說是在app.build中加入jackOptions 中就行了。

defaultConfig {
        jackOptions {
            enabled true
        }
    }
           

同步了一下,結果.....并沒有成功!報下面的錯誤:

Kotlin Gradle plugin does not support the deprecated Jack toolchain.Disable Jack or revert to Kotlin Gradle plugin version 1.1.1.

Android Studio中如何支援使用Lambda表達式

遇到這種工程建構的錯誤,确實是挺煩人的,但是大家一定要有耐心,仔細查錯,不要着急。

按照上面提示:Kotlin版本不支援配置jackOptions ,要我把版本Kotlin改成1.1.1。OK,那就把Kotlin版本改成1.1.1咯,同步一下,OK。但是發現這樣的方式,導緻項目建構很慢,于是乎又找了另外一種方法配置。

簡單一步到位的配置支援Lambda

針對我的項目從頭開始,手動去添加支援lambda的插件,也是OK的,這樣一步到位,不會出錯,完整的配置為:

工程的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插件可配可不配都行)

繼續閱讀