在Android中使用lambda表達式

一、參考文章

怒學Java8系列一:Lambda表達式
Android開發中使用lambda表達式
android lambda語法簡述

二、Oracle官方介紹

lambda簡介
  • 簡單說,就是Lambda提供了一個清晰和簡潔的方式來表示一個方法的接口使用的表達式。

三、AS配置使用環境

3.1 Android Studio 2.1.1之前,需要自己導入插件

  • 3.1.1 在 Project 的 build.gradle 中添加如下代碼

      dependencies {
            classpath 'me.tatarka:gradle-retrolambda:3.2.0'
      }
    
  • 3.1.2 在 Module 的 build.gradle 中添加如下代碼

      // 應用插件
      apply plugin: 'me.tatarka.retrolambda'
    
      // 支持Java8
      android {
          compileOptions {
              sourceCompatibility JavaVersion.VERSION_1_8
              targetCompatibility JavaVersion.VERSION_1_8
          }
      }
    
  • 配置完,編譯一下就大功告成

3.2 Android Studio 2.1.1之后(支持lambda插件)

  • 先將SDK更新到最新,然后在 Module 的 build.gradle 文件中添加如下代碼

      android {
          defaultConfig {
              jackOptions {
                  // 打開jack編譯器
                  enabled true
              }
          }
    
          // 編譯支持Java8
          compileOptions {
              sourceCompatibility JavaVersion.VERSION_1_8
              targetCompatibility JavaVersion.VERSION_1_8
          }
      }
    

四、Lambda表達式的使用

在AS中,如果配置了lambda的插件,可以用lambda的地方就會自動變灰色,然后用lambda替換就好了。

語法

語法一:()->{}
其中()和{}可以看情況去掉,()只有一個參數可去掉,{}里邏輯只有一行可去掉

  • 無參數時,直接這么寫

        // 創建Runnable對象
        Runnable runnable = () -> {
      
         };
    
  • 有一個參數時,直接 參數名 -> {}

      View.OnClickListener listener = view -> {
      
      };
    
  • 有多個參數時,只需要在()里寫上參數名字就可以

      View.OnFocusChangeListener listener = (view, b) -> {
      
      };
    

語法二:::(兩個英文冒號)

::是對語法一的簡化。

  • 如下代碼,可以實現語法一一樣的效果

      static class LambdaTest{
          public static void getData(String args1,boolean args2,int args3){
              System.out.println("獲取數據了");
          }
      }
    
      interface RequestTask {
          void requestData(String args1,boolean args2,int args3);
      }
    
      public static void main(String args[]){
    
          RequestTask task1 = (args1, args2, args3) -> LambdaTest.getData(args1,args2,args3);
    
          RequestTask task2 = LambdaTest::getData;
      }
    
  • :: 語法有一下幾種使用情況

    • 靜態方法引用:ClassName::staticMethodName
    • 實例上的實例方法引用:instanceReference::methodName
    • 構造方法引用:ClassName::new

歡迎大家訪問我的簡書博客GitHub

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容