lambda語法

前言

在JDK8之前笼痹,Java是不支持函數(shù)式編程的酪穿,所謂的函數(shù)編程凳干,即可理解是將一個函數(shù)(也稱為“行為”)作為一個參數(shù)進行傳遞。通常我們提及得更多的是面向?qū)ο缶幊瘫患茫嫦驅(qū)ο缶幊淌菍?shù)據(jù)的抽象(各種各樣的POJO類)救赐,而函數(shù)式編程則是對行為的抽象(將行為作為一個參數(shù)進行傳遞)。

認識Lambda表達式

在IDEA中創(chuàng)建一個線程:

 new Thread(new Runnable() {
     @Override
     public void run() {
         System.out.println("Hello World!");
     }
 });

DEA會給出提示可以使用Lambda表達式替換只磷。


image.png

使用Lambda表達式則只需要使用一句話就可代替上面使用匿名類的方式经磅。

new Thread(() -> System.out.println("Hello World!"));

在這個例子中,傳統(tǒng)的語法規(guī)則钮追,我們是將一個匿名內(nèi)部類作為參數(shù)進行傳遞预厌,我們實現(xiàn)了Runnable接口,并將其作為參數(shù)傳遞給Thread類畏陕,這實際上我們傳遞的是一段代碼配乓,也即我們將代碼作為了數(shù)據(jù)進行傳遞,這就帶來許多不必要的“樣板代碼”。

Lambda表達式一共有三部分組成:

image.png

什么時候在什么場景下可以使用Lambda表達式

能夠接收Lambda表達式的參數(shù)類型犹芹,是一個只包含一個方法的接口崎页。只包含一個方法的接口稱之為“函數(shù)接口”.

例如上面創(chuàng)建一個線程的示例,Runnable接口只包含一個方法腰埂,所以它被稱為“函數(shù)接口”飒焦,所以它可以使用Lambad表達式來代替匿名內(nèi)部類。

示例一(不包含參數(shù)屿笼,也不包含返回值的lambda表達式)

package com.coderbuff.custom;

/**
 * 函數(shù)接口:只有一個方法的接口牺荠。作為Lambda表達式的類型
 * Created by Kevin on 2018/2/17.
 */
public interface FunctionInterface {
    void test();
}
package com.coderbuff.custom;

import org.junit.Test;

/**
 * 函數(shù)接口測試
 * Created by Kevin on 2018/2/17.
 */
public class FunctionInterfaceTest {

    @Test
    public void testLambda() {
        func(new FunctionInterface() {
            @Override
            public void test() {
                System.out.println("Hello World!");
            }
        });
        //使用Lambda表達式代替上面的匿名內(nèi)部類
        func(() -> System.out.println("Hello World"));
    }

    private void func(FunctionInterface functionInterface) {
        functionInterface.test();
    }
}

可以看到,只要是一個接口中只包含一個方法驴一,則可以使用Lambda表達式休雌,這樣的接口稱之為“函數(shù)接口”。

示例二 (包含參數(shù)肝断,不包含返回值的Lambda表達式)

package com.coderbuff.custom;

/**
 * 函數(shù)接口:只有一個方法的接口杈曲。作為Lambda表達式的類型
 * Created by Kevin on 2018/2/17.
 */
public interface FunctionInterface {
    void test(int param);
}
package com.coderbuff.custom;

import org.junit.Test;

/**
 * 函數(shù)接口測試
 * Created by Kevin on 2018/2/17.
 */
public class FunctionInterfaceTest {

    @Test
    public void testLambda() {
        //使用Lambda表達式代替匿名內(nèi)部類
        func((x) -> System.out.println("Hello World" + x));
    }

    private void func(FunctionInterface functionInterface) {
        int x = 1;
        functionInterface.test(x);
    }
}

Lambda表達式“(x) -> Sysout.out.println("Hello World" + x)”,左邊傳遞的是參數(shù)胸懈,此處并沒有指明參數(shù)類型担扑,因為它可以通過上下文進行類型推導(dǎo),但在有些情況下不能推導(dǎo)出參數(shù)類型(在編譯時不能推導(dǎo)通常IDE會提示)趣钱,此時則需要指明參數(shù)類型涌献。
哪種情況不能推導(dǎo)出參數(shù)類型呢?就是函數(shù)接口是一個泛型的時候首有。

package com.coderbuff.custom;

/**
 * 函數(shù)接口:只有一個方法的接口燕垃。作為Lambda表達式的類型
 * Created by Kevin on 2018/2/17.
 */
public interface FunctionInterface<T> {
    void test(T param);
}
package com.coderbuff.custom;

import org.junit.Test;

/**
 * 函數(shù)接口測試
 * Created by Kevin on 2018/2/17.
 */
public class FunctionInterfaceTest {

    @Test
    public void testLambda() {
        //使用Lambda表達式代替匿名內(nèi)部類
        func((Integer x) -> System.out.println("Hello World" + x));
    }

    private void func(FunctionInterface<Integer> functionInterface) {
        int x = 1;
        functionInterface.test(x);
    }
}

示例三(有參數(shù),有返回值的Lambda表達式)

package com.coderbuff.custom;

/**
 * 函數(shù)接口:只有一個方法的接口绞灼。作為Lambda表達式的類型
 * Created by Kevin on 2018/2/17.
 */
public interface FunctionInterface<T> {
    boolean test(T param);
}
package com.coderbuff.custom;

import org.junit.Test;

/**
 * 函數(shù)接口測試
 * Created by Kevin on 2018/2/17.
 */
public class FunctionInterfaceTest {

    @Test
    public void testLambda() {
        //使用Lambda表達式代替匿名內(nèi)部類
        func((Integer x) -> true);
    }

    private void func(FunctionInterface<Integer> functionInterface) {
        int x = 1;
        functionInterface.test(x);
    }
}

此時的Lambda表達式“(Integer x) -> true”利术,右邊是表達式的主體,直接返回true低矮,如果有多行代碼印叁,則可以直接使用花括號表示,例如:

func((Integer x) -> {
    System.out.println("Hello World" + x);
    return true;
});

**這三種基本情況已經(jīng)大致清楚了军掂,特別是需要弄清轮蜕,什么時候可以使用Lambda表達式代替匿名內(nèi)部類,也就是Lambda表達式的應(yīng)用場景是函數(shù)接口蝗锥。Lambda表達式這一新特性在JDK8中的引入跃洛,更大的好處則是集合API的更新,新增的Stream類庫终议,使得我們在遍歷使用集合時不再像以往那樣不斷地使用for循環(huán)汇竭。

常用的函數(shù)式接口

@FunctionalInterface注解
@FunctionalInterface注解的功能就是約束一個接口只能有一個方法葱蝗,參數(shù)沒有限制,返回值可有可無

當一個接口使用該注解细燎,就代表該接口是一個函數(shù)式接口两曼,也就可以使用lambda表達式簡化使用

四大函數(shù)式接口

  • ① Function<T, R> : 函數(shù)型接口
    有參數(shù)、有返回值

R apply(T t);

  • ② Consumer : 消費型接口
    有參數(shù)玻驻,無返回值

void accept(T t);

  • ③ Supplier : 供給型接口
    無參數(shù)悼凑,有返回值

T get();

  • ④ Predicate : 判斷型接口
    有參數(shù),返回一個boolean值

boolean test(T t);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末璧瞬,一起剝皮案震驚了整個濱河市户辫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗤锉,老刑警劉巖渔欢,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異档冬,居然都是意外死亡膘茎,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進店門酷誓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人态坦,你說我怎么就攤上這事盐数。” “怎么了伞梯?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵玫氢,是天一觀的道長。 經(jīng)常有香客問我谜诫,道長漾峡,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任喻旷,我火速辦了婚禮生逸,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘且预。我一直安慰自己槽袄,他們只是感情好,可當我...
    茶點故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布锋谐。 她就那樣靜靜地躺著遍尺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪涮拗。 梳的紋絲不亂的頭發(fā)上乾戏,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天迂苛,我揣著相機與錄音,去河邊找鬼鼓择。 笑死三幻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的惯退。 我是一名探鬼主播赌髓,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼催跪!你這毒婦竟也來了锁蠕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤懊蒸,失蹤者是張志新(化名)和其女友劉穎荣倾,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骑丸,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡舌仍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了通危。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片铸豁。...
    茶點故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖菊碟,靈堂內(nèi)的尸體忽然破棺而出节芥,到底是詐尸還是另有隱情,我是刑警寧澤逆害,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布头镊,位于F島的核電站,受9級特大地震影響魄幕,放射性物質(zhì)發(fā)生泄漏相艇。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一纯陨、第九天 我趴在偏房一處隱蔽的房頂上張望坛芽。 院中可真熱鬧,春花似錦队丝、人聲如沸靡馁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臭墨。三九已至,卻和暖如春膘盖,著一層夾襖步出監(jiān)牢的瞬間胧弛,已是汗流浹背尤误。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留结缚,地道東北人损晤。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像红竭,于是被迫代替她去往敵國和親尤勋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,665評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Chaweys閱讀 571評論 0 0
  • 提到Lambda表達式茵宪,也許你聽過Lambda演算最冰。其實這是這是兩個不同的概念,Lambda演算和圖靈機一樣稀火,是一...
    AndYMJ閱讀 498評論 0 0
  • 語法: lambdaargument1暖哨,argument2,... argumentN:expression 示例...
    WillCheng閱讀 470評論 1 1
  • 在講解Lambda語法之前我們需要先明確一點:Lambda表達式需要函數(shù)式接口的支持凰狞。什么是函數(shù)式接口篇裁?其實就是接...
    敗給小蘿莉閱讀 417評論 0 0
  • Java 8引入Lambda表達式,在編寫Lambda表達式時赡若,也會隨之被編譯成一個函數(shù)式接口达布。在java中一般習...
    John_Phil閱讀 1,382評論 0 5