前言
隨著MVP模式的流行使得我們?cè)陂_(kāi)發(fā)中多了大量的接口,然而總會(huì)有那么多喜歡裝逼的人會(huì)在項(xiàng)目中引入一些新的寫(xiě)法,讓別人看得一臉懵逼,作為一個(gè)裝逼成癮的我肯定不允許有人在代碼中裝逼超過(guò)我。
我看你骨骼驚奇 是個(gè)練武奇才,我這兒有本武林秘籍,拿回去好好練 -> 裝逼速成法(還帶我自編的口訣,記得好評(píng)哦 親?。?/p>

今天向大家介紹的是作為java8家族的新成員Lambda表達(dá)式
一、Lambda表達(dá)式的引入
使用Lambda需要在項(xiàng)目的build.gradle中添加如下配置
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.hubin.bankcardidentify"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//1.使用Lambda表達(dá)式的配置
jackOptions.enabled = true
}
//2.使用Lambda表達(dá)式的配置
compileOptions{
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
二、Lambda表達(dá)式使用場(chǎng)景舉例
我們?cè)陧?xiàng)目中都會(huì)有為某個(gè)按鈕或者控件設(shè)置點(diǎn)擊監(jiān)聽(tīng),正常人的寫(xiě)法都是這么寫(xiě)的setOnClickListener(this) 參數(shù)填this讓本類自己實(shí)現(xiàn)接口。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ocr);
ImageView mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageView:
//****
break;
}
}
但是這么寫(xiě)有一個(gè)很不方便的問(wèn)題,當(dāng)類中的接口非常多的時(shí)候 我們往往要找半天才找到這個(gè)接口是哪個(gè)方法調(diào)用過(guò)來(lái)的,于是我們又有人喜歡這么寫(xiě):
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ocr);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setOnClickListener(onClickListener);
}
private View.OnClickListener onClickListener=new View.OnClickListener() {
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.imageView:
//****
break;
}
}
};
這樣寫(xiě)很方便我們查看代碼,因?yàn)橹灰覀儼醋trl 鼠標(biāo)點(diǎn)擊接口的實(shí)現(xiàn)onClickListener就會(huì)自動(dòng)跳到調(diào)用它的位置,但是很明顯這樣的代碼看上去多縮進(jìn)了一層,有潔癖的我明顯不喜歡這么寫(xiě)。那怎么辦呢!當(dāng)然是用我們的Lambda表達(dá)式來(lái)解決此問(wèn)題,將上述代碼用Lambda表達(dá)式改造如下:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ocr);
mImageView = (ImageView) findViewById(R.id.imageView);
mImageView.setOnClickListener(onClickListener);
}
private OnClickListener mTakePicturesLinstener = (View v) -> {
switch (v.getId()) {
case R.id.imageView:
//****
break;
}
};
這樣寫(xiě)完之后AndroidStudio左側(cè)還會(huì)出現(xiàn)一個(gè)帶向上箭頭的圖標(biāo),點(diǎn)擊這個(gè)圖標(biāo)還能夠迅速跳轉(zhuǎn)到這個(gè)接口定義的地方

三、Lambda表達(dá)式的規(guī)則
上述代碼是如何變化過(guò)來(lái)的呢,如下圖,紅色區(qū)域的接口實(shí)現(xiàn)代碼可以直接替換成藍(lán)色區(qū)域的Lamdba表達(dá)式表示.

()->{} 這就是Lamdba表達(dá)式,小括號(hào)中填寫(xiě)的就是 OnClickListener 里面唯一一個(gè)需要實(shí)現(xiàn)的方法中的參數(shù),像這種凡是只有一個(gè)待實(shí)現(xiàn)方法的接口都可以用Lamdba表達(dá)式表示
四、自創(chuàng)記憶口訣
其實(shí)Lamdba表達(dá)式 就是這個(gè)東西: ()->{} 直接把他用漢語(yǔ)表示過(guò)來(lái),我的記憶口訣就是:
小括號(hào)指向大括號(hào),小括號(hào)里面放參數(shù),大括號(hào)里面寫(xiě)代碼。
啊哈哈。。 是不是很坑爹的口訣。。
五、進(jìn)一步簡(jiǎn)化
- 1.如果是向上述一樣括號(hào)里面只有一個(gè)參數(shù)我們可以直接這樣寫(xiě):參數(shù)類型 和括號(hào)都可以省略:

- 2.如果大括號(hào)里面的代碼有返回值,直接寫(xiě)return即可

- 3.如果小括號(hào)里面參數(shù)是多個(gè) 并且有返回值,可以這么寫(xiě)(即使參數(shù)類型不相同虛擬機(jī)也會(huì)自動(dòng)幫你辨別)

- 4.還有一個(gè)最不好理解的用法,這里不解釋自己看圖理解

六、最后一定要記住我的口訣
那么大表達(dá)式:
小括號(hào)指向大括號(hào),小括號(hào)里面放參數(shù),大括號(hào)里面寫(xiě)代碼。
那么大表達(dá)式:
小括號(hào)指向大括號(hào),小括號(hào)里面放參數(shù),大括號(hào)里面寫(xiě)代碼。
那么大表達(dá)式:
小括號(hào)指向大括號(hào),小括號(hào)里面放參數(shù),大括號(hào)里面寫(xiě)代碼。
重要的事情說(shuō)三遍。。。