1. 程式人生 > >java 8 Lambda 表示式你會用了嗎?

java 8 Lambda 表示式你會用了嗎?

jdk1.8沒有新增新的關鍵字 lambda ,而是用()->{} 這麼一個表示式符號來表示 lambda 這麼一個新鮮的函式是為了什麼?使用 這個表示式 有可以給我們帶來什麼樣的好處呢?敬請關注 本臺 Lambda 的無窮大吹大了,好熱

在寫之前肯定是要看關於 lambda 文章的,這篇文章很簡單就是告訴你 lambda 函式是如何使用的 ( Java 8新特性:lambda表示式),要想詳細瞭解 Lambda 表示式請看這篇(深入理解 Java8 Lambda)看了這篇文章就迫不及待的想小試牛刀了,開啟as 就開始寫了一個簡單的介面,寫了一個方法呼叫了介面的方法,增加了點選事件並回調接口裡的的方法。等我使用到了 () -> 這個符號來表示介面的方法的並在函式裡面彈出一個Toast 的時候,這時候腦袋就開始大了。。這裡寫圖片描述

為什麼我就不可以使用呢 ? 等我問過我使用的朋友的時候才知道原來android 現在還不支援java 8 ,我們需要配置外掛,依賴外掛來使用配置方法如下:
project(gradle)下新增如下一段程式碼:

   dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0' // 專案構建依賴的 gradle 版本,
        classpath 'me.tatarka:gradle-retrolambda:3.2.5'
        }

module(gradle) 配置如下:
在頂部依賴 retrolambda 庫

apply plugin: 'me.tatarka.retrolambda'

在 android{} 這裡面來配置以下程式碼,讓其支援 retrolambda

   compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

下面我們就可以愉快的玩耍 Lambda 了 這裡寫圖片描述

下面給button 增加一個點選事件 我們看看 lambda 是如何進行 方法的表達的:
 mLambdaBtn.setOnClickListener
(v -> { Toast.makeText(getApplicationContext(), "lambda 表示式" , Toast.LENGTH_SHORT).show(); });

下面瞧瞧原來的寫法 我們還要重寫onClick()方法:

mLambdaBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getApplicationContext(), "點選事件" , Toast.LENGTH_SHORT).show();
            }
        });

我們對比下兩種的優缺點:
優點:
1. 可以明顯就看說我們的程式碼變少了,也變整潔了。
缺點:
1. 程式碼的閱讀性變差了。對不瞭解lambda的人看這種程式碼的會忍不住 MN (fuck)

Lambda 表示式的語法由引數列表、-> 和函式體組成,函式體既可以是一個表達塊也可以是一個語句塊。

在使用Lambda 表示式的時候,如過方法只有一個引數,並且他的型別可以被推導得知時,該引數外面的括號可以被省略。
可以使用 Lambad表示式看起來不需要我們實現介面內部的方法,但是在 Lambad 編譯的時候也會被編譯為一個實現類,只不過語法上做了簡化而已。
對於 java 自帶的標準庫的大量單一方法介面,很多都已經標記為 @functionalInterface ,表明該介面可以作為函式使
用。
只有一個方法的介面稱之為函式介面。
Lambda 表示式的語法 由引數列表、箭頭 -> 和 函式體組成。函式體既可以是一個表示式,也可以是一個語句塊。