Lambda ,如果不知道怎麼讀,那λ怎麼讀吧,它是Java1.8 新增的特性,詳細介紹請看這裏:Java 8簡明教程。
lambda表達式取代了匿名內部類,取消了模板,允許程序猿用函數式風格編寫代碼,使代碼可讀性更高,儘管剛開始你會看不懂,但是你應該嘗試,畢竟這是新的東西,我已從中獲益。
格式
基本格式是:() -> {}
有下面三種具體表達:
- (params) -> expression
- (params) -> statement
- (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,因爲那個下拉菜單裏沒有這一選項,如下:
這裏採用的是第二種方法,然後項目自動同步。
同步後是會在build.gradle腳本下生成和上面一樣的東東:
舉例
點擊按鈕觸發事件
傳統的點擊事件,應用匿名內部類:
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()裏會有下面提示:
然後我們按快捷鍵Alt+Enter,是這樣的
繼續回車後,見證奇蹟的時刻到來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 字節碼指令來動態綁定這個方法。