前言
創(chuàng)新互聯(lián)是一家專業(yè)提供西豐企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、H5網(wǎng)站設(shè)計(jì)、小程序制作等業(yè)務(wù)。10年已為西豐眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)的建站公司優(yōu)惠進(jìn)行中。
Google在今年發(fā)布Android N開(kāi)發(fā)者預(yù)覽版,一并宣布開(kāi)始支持Java 8。我們終于能在Android開(kāi)發(fā)中使用到Java8的一些語(yǔ)言特性了。目前支持:
今天我們就簡(jiǎn)要學(xué)習(xí)lambda表達(dá)式。
配置開(kāi)發(fā)環(huán)境
首先需要下載安裝JDK1.8。
如果想在Android開(kāi)發(fā)中使用lambda表達(dá)式,需要在Android Studio中配置Java 8開(kāi)發(fā)環(huán)境。
配置app的Gradle文件:
android { defaultConfig { ... //開(kāi)啟jack編譯 jackOptions { enabled true } } ... //將編譯選項(xiàng)設(shè)置為Java1.8 compileOptions { targetCompatibility 1.8 sourceCompatibility 1.8 } }
出于種種原因,可能我們使用的JDK版本是1.7甚至更低,但是我們又想學(xué)習(xí)使用lambda表達(dá)式,怎么辦呢?Github上已經(jīng)有開(kāi)發(fā)者設(shè)計(jì)了兼容lambda表達(dá)式到Java7,6,5的開(kāi)源庫(kù)retrolamda。至于如何在Android Studio中配置,在此就不啰嗦了??梢詤⒖碐radle Retrolambda Plugin。
第一個(gè)lambda表達(dá)式
看到下面的代碼,相信大家都會(huì)非常熟悉。這不就是給button設(shè)置監(jiān)聽(tīng)事件嘛。
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("TAG","按鈕被點(diǎn)擊,匿名內(nèi)部類"); } });
分析上面的代碼,這是通過(guò)匿名內(nèi)部類來(lái)設(shè)置Button的點(diǎn)擊監(jiān)聽(tīng)事件的。也就是說(shuō),我們創(chuàng)建了一個(gè)實(shí)現(xiàn)了 View.OnClickListener
接口的匿名類的對(duì)象。匿名內(nèi)部類實(shí)現(xiàn)了 onClick
方法。通過(guò)這個(gè)匿名類的對(duì)象,我們?cè)谟脩酎c(diǎn)擊按鈕時(shí),打印出日志。
可是,大家有沒(méi)有發(fā)現(xiàn)。上面那段代碼,真正有用的就是 Log.d("TAG","按鈕被點(diǎn)擊,匿名內(nèi)部類"); 這一行代碼,這就反映了使用匿名內(nèi)部類的缺點(diǎn):
而lambda表達(dá)式很好的解決了這些問(wèn)題:
button.setOnClickListener(view-> Log.d(TAG,"按鈕被點(diǎn)擊,lambda表達(dá)式"));
view-> Log.d(TAG,"按鈕被點(diǎn)擊,lambda表達(dá)式"));
就是我們寫(xiě)的第一個(gè)lambda表達(dá)式。
lambda表達(dá)式通常以 (argument)->(body)
這樣的格式書(shū)寫(xiě)。
//省略參數(shù)類型 (arg1,arg2...) -> {body} //指定參數(shù)類型 (Type1 arg1,Type2 arg2...)->{body}
lambda表達(dá)式中,參數(shù)的類型可省略。Java編譯器根據(jù)表達(dá)式的上下文推導(dǎo)出參數(shù)的類型。就像上面圖中 view 的類型是 View 。
lambda表達(dá)式的結(jié)構(gòu)
//零個(gè) ()-> System.out.println("no argument"); //一個(gè) x->x+1 //兩個(gè) (x,y)->x+y //省略參數(shù)類型 View.OnClickListener oneArgument = view->Log.d(TAG,"one argument"); //指定參數(shù)類型 View.OnClickListener oneArgument = (View view)->Log.d(TAG,"one argument"); //多行語(yǔ)句 //返回類型是代碼塊返回的void View.OnClickListener multiLine = (View view)->{ Log.d(TAG,"multi statements"); Log.d(TAG,"second line"); } //返回類型是表達(dá)式主體語(yǔ)句的返回類型int (int x)->x+1
lambda表達(dá)式的類型
我們都知道,Java是一種強(qiáng)類型語(yǔ)言。所有的方法參數(shù)都有類型,那么lambda表達(dá)式是一種什么類型呢?
View.OnClickListener listener = new View.OnClickListener() { @Override public void onClick(View v) { //... } }; button.setOnClickListener(listener);
如上所示,以往我們是通過(guò)使用單一方法的接口來(lái)代表一個(gè)方法并且重用它。
在lambda表達(dá)式中,仍使用的和之前一樣的形式。我們叫做函數(shù)式接口(functional interface)
如我們之前button的點(diǎn)擊響應(yīng)事件使用的 View.OnClickListener 就是一個(gè)函數(shù)式接口。
public class View implements Drawable.Callback, KeyEvent.Callback, AccessibilityEventSource { ... public interface OnClickListener { void onClick(View v); } ... }
那究竟什么樣的接口是函數(shù)式接口呢?
函數(shù)式接口是只有一個(gè)抽象方法的接口。用作表示lambda表達(dá)式的類型。
Java8 API中新增了許多函數(shù)式接口:
接口名 | 參數(shù) | 返回值 | 用途 |
---|---|---|---|
Predicate | T | boolean | 斷言 |
Consumer | T | void | 消費(fèi) |
Function | T | R | 函數(shù) |
Supplier | None | T | 工廠方法 |
UnaryOperator | T | T | 邏輯非 |
BinaryOperator | (T,T) | T | 二元操作 |
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。