Google在今年發布Android N開發者預覽版,一並宣布開始支持Java 8。我們終於能在Android開發中使用到Java8的一些語言特性了。目前支持:
今天我們就簡要學習lambda表達式。
首先需要下載安裝JDK1.8。
如果想在Android開發中使用lambda表達式,需要在Android Studio中配置Java 8開發環境。
配置app的Gradle文件:
android {
defaultConfig {
...
//開啟jack編譯
jackOptions {
enabled true
}
}
...
//將編譯選項設置為Java1.8
compileOptions {
targetCompatibility 1.8
sourceCompatibility 1.8
}
}
出於種種原因,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學習使用lambda表達式,怎麼辦呢?Github上已經有開發者設計了兼容lambda表達式到Java7,6,5的開源庫retrolamda。至於如何在Android Studio中配置,在此就不啰嗦了。可以參看Gradle Retrolambda Plugin。
看到下面的代碼,相信大家都會非常熟悉。這不就是給button設置監聽事件嘛。
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("TAG","按鈕被點擊,匿名內部類");
}
});
分析上面的代碼,這是通過匿名內部類來設置Button的點擊監聽事件的。也就是說,我們創建了一個實現了View.OnClickListener
接口的匿名類的對象。匿名內部類實現了onClick
方法。通過這個匿名類的對象,我們在用戶點擊按鈕時,打印出日志。
可是,大家有沒有發現。上面那段代碼,真正有用的就是Log.d("TAG","按鈕被點擊,匿名內部類");
這一行代碼,這就反映了使用匿名內部類的缺點:
而lambda表達式很好的解決了這些問題:
button.setOnClickListener(view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));
view-> Log.d(TAG,"按鈕被點擊,lambda表達式"));
就是我們寫的第一個lambda表達式。
由上圖可知,lambda表達式通常以(argument)->(body)
這樣的格式書寫。
//省略參數類型
(arg1,arg2...) -> {body}
//指定參數類型
(Type1 arg1,Type2 arg2...)->{body}
lambda表達式中,參數的類型可省略。Java編譯器根據表達式的上下文推導出參數的類型。就像上面圖中view
的類型是View
。
//零個
()-> System.out.println("no argument");
//一個
x->x+1
//兩個
(x,y)->x+y
//省略參數類型
View.OnClickListener oneArgument = view->Log.d(TAG,"one argument");
//指定參數類型
View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument");
//多行語句
//返回類型是代碼塊返回的void
View.OnClickListener multiLine = (View view)->{
Log.d(TAG,"multi statements");
Log.d(TAG,"second line");
}
//返回類型是表達式主體語句的返回類型int
(int x)->x+1