在Android Studio中使用Lambda表達式

Lambda表達式是在JDK 8中開始支持的一種函數式推導語言,能夠大量減少匿名內部類那種冗餘的代碼。在Android中,可以大量使用在設置監聽,設置異步回調等場景。

  目前Android開發已經漸漸到從Eclipse 的ADT遷移到了Android Studio,但是Android Studio目前的版本還沒有直接支持Lambda表達式的支持,需要插件支持,當然,JDK版本也必須使用JDK 8 或者以上(當然過些時間會有更高版本的JDK)。

  1.引入retrolambda插件:

  在Project的build.gradle中添加

apply plugin: ‘me.tatarka.retrolambda‘

      2. 設置編譯選項(可能也可以不寫)

  在Project的build.gradle的android節點中添加如下代碼

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

   3. 引入retrolambda的類路徑,在Module:app的build.gradle中的buildscript->dependencies節點中添加如下代碼

classpath ‘me.tatarka:gradle-retrolambda:3.2.0‘

  4. 對build.gradle進行build

  5.編寫測試代碼,簡單寫法如下

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.text);
        textView.setOnClickListener( v -> Toast.makeText(getApplicationContext(), "Lambda", Toast.LENGTH_LONG).show());
    }

    6.運行查看是否正常


詳細一點爲:

Android Studio默認使用Lambda表達式是會報錯的,即使你使用的是java 8,爲了在android studio中使用lambda表達式,我們必須藉助一個插件retrolambda ,該插件將java 8中的lambda表達式特性兼容到java 5。使用它也很簡單。

首先先項目根目錄下的build.gradle中加入

classpath 'me.tatarka:gradle-retrolambda:3.2.0'

最終整個文件會像這樣子

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
        classpath 'me.tatarka:gradle-retrolambda:3.2.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

然後再module目錄下的build.gradle中使用插件,加入

apply plugin: 'me.tatarka.retrolambda'

並且在android節點下加入

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

最終整個文件就像這樣子

apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'
android {
    compileSdkVersion 22
    buildToolsVersion 22.0.1

    defaultConfig {
        applicationId cn.edu.zafu.rxdemo
        minSdkVersion 15
        targetSdkVersion 22
        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'])
    compile 'com.android.support:appcompat-v7:22.2.0'

}

現在讓我們試試lambda表達式,就拿View的點擊事件做實驗吧。

在使用lambda表達式之前是這樣子的

btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
          Toast.makeText(getApplicationContext(), test, Toast.LENGTH_LONG).show()
      }
});

使用了lambda表達式之後是這樣子的

btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(v -> Toast.makeText(getApplicationContext(), test, Toast.LENGTH_LONG).show()
);

好了,運行一下項目,如果點擊按鈕出現了Toast說明你成功了,但是如果你運行出現ClassNotFound的錯誤的話clean一下項目,再編譯運行,就能成功運行了。

怎麼樣,有沒有發現代碼精簡了許多。這篇文章算是開始RxJava(RxAndroid)的學習之路的第一篇博文吧,畢竟RxJava大量使用了lambda表達式特性。雖然也可以不用lambda表達式,但是使用了lambda表達式後會顯得代碼特別精簡。


發佈了21 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章