Lambda表達(dá)式快速掌握指南

前言

隨著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ō)三遍。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 簡(jiǎn)介 概念 Lambda 表達(dá)式可以理解為簡(jiǎn)潔地表示可傳遞的匿名函數(shù)的一種方式:它沒(méi)有名稱,但它有參數(shù)列表、函數(shù)主...
    劉滌生閱讀 3,345評(píng)論 5 18
  • 摘要:此篇文章主要介紹 Java8 Lambda 表達(dá)式產(chǎn)生的背景和用法,以及 Lambda 表達(dá)式與匿名類的不同...
    OneAPM閱讀 2,142評(píng)論 0 26
  • 一、什么是函數(shù)式編程 下面開(kāi)始進(jìn)入正題。 二、Lambda表達(dá)式 2.1 在Android studio中使用Ja...
    仁昌居士閱讀 1,361評(píng)論 1 2
  • 聲明:本文翻譯自The Java? Tutorials(官方文檔) 簡(jiǎn)述 匿名類有一個(gè)問(wèn)題,如果匿名類的實(shí)現(xiàn)非常簡(jiǎn)...
    猴子小皮球閱讀 4,943評(píng)論 0 9
  • 最近整理筆記需要對(duì)菜單進(jìn)行截圖 可貌似菜單不太聽(tīng)話 一按鼠標(biāo)或鍵盤就消失,print screen鍵除外 于是對(duì)比...
    龍家二少閱讀 690評(píng)論 0 2

友情鏈接更多精彩內(nèi)容