Android中使用Lambda表達式

      Lambda ,如果不知道怎麼讀,那λ怎麼讀吧,它是Java1.8 新增的特性,詳細介紹請看這裏:Java 8簡明教程

     lambda表達式取代了匿名內部類,取消了模板,允許程序猿用函數式風格編寫代碼,使代碼可讀性更高,儘管剛開始你會看不懂,但是你應該嘗試,畢竟這是新的東西,我已從中獲益。

    

格式

基本格式是:() -> {}

有下面三種具體表達:

  1. (params) -> expression
  2. (params) -> statement
  3. (params) -> {statement}

這個新的特性是激動人心的,那麼有個問題,怎麼用,是啊,很多東西我們都懂,但爲什麼還是過不好這一生,說遠了,問題的關鍵是:用,得用,你還得會用。

lambda使用舉例


as裏的配置

要使用lambda,首先必須配置編譯環境,這裏使用的android studio,as默認的jdk版本是1.6,修改成1.8即可使用,這裏確保你係統安裝了jdk1.8,否則需要用到下面插件:gradle-retrolambda

as裏的配置有兩種方法:

配置gradle腳本

在build.gradle腳本中添加下列代碼:

android {
   compileOptions {
       sourceCompatibility 1.8
       targetCompatibility 1.8
   }
}

當然寫成下面的樣子也是可以的

android {
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}

設置項目結構

按快捷鍵Ctrl+Shift+Alt+S進入項目結構設置,把app的jdk版本修改成1.8,注意你需要填寫1.8,因爲那個下拉菜單裏沒有這一選項,如下:


1

這裏採用的是第二種方法,然後項目自動同步。

同步後是會在build.gradle腳本下生成和上面一樣的東東:


2

舉例

點擊按鈕觸發事件

傳統的點擊事件,應用匿名內部類:

Button button = (Button) findViewById(R.id.btn_insert);
    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show();
        }
    });

通過上面設置jdk版本爲1.8後,鼠標放到new View.OnClickListener()裏會有下面提示:


3

然後我們按快捷鍵Alt+Enter,是這樣的


4

繼續回車後,見證奇蹟的時刻到來lo。。。

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

Button button = (Button) findViewById(R.id.btn_insert);
button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "hello", Toast.LENGTH_LONG).show());

一行代碼就搞定了,清晰可見,把行爲傳到了函數裏,這裏注意v不可省略,是函數onClick的參數,當然就可以是任意名字,我還是建議就用一個字母表示,簡單嘛,當然了首先你得知道她的意思,儘管她的很多行爲你始終不會明白,哈哈。

實現Runnable接口

傳統實現Runnable接口是這樣的:

new Thread(new Runnable() {
    @Override
    public void run() {
        Log.i("TAG", "haha");
    }
}).start();

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

new Thread(() -> {
    Log.i("TAG", "haha");
}).start();

哇哦,是不是有種很清爽的感覺,乍一看,這是什麼鬼,仔細分析後是用了lambda表達式() -> {},哈哈,簡單的愛,這是程序員懶惰的一種體現,可以寫出更簡潔高校的代碼,贊一個。

比較

既然lambda表達式即將正式取代Java代碼中的匿名內部類,那麼有必要對二者做一個比較分析。

第一個關鍵的不同點就是關鍵字 this。匿名類的 this 關鍵字指向匿名類,而lambda表達式的 this 關鍵字指向包圍lambda表達式的類。

第二是編譯方式。Java編譯器將lambda表達式編譯成類的私有方法。使用了Java 7的 invokedynamic 字節碼指令來動態綁定這個方法。

總結

lambda表達式還有很多用法,比如迭代器,詳細用法請參考這裏:Java8 lambda表達式10個示例

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章