Lambda表達式

1.什么是Lambda表達式

函數(shù)式編程

函數(shù)式編程思想盡量忽略面向?qū)ο蟮膹?fù)雜語法, 強調(diào)做什么, 而不是以什么開式做; 例如線程執(zhí)行任務(wù), 使用函數(shù)式思想, 就可以通過傳遞一段任務(wù)代碼給線程對象執(zhí)行, 而不需要創(chuàng)建任務(wù)對象;
Lambda表達式一方面是函數(shù)式編程, 別一方面是可以 簡化代碼;

2.Lambda表達式的使用前提與場景

  • 當且僅當, 一個接口, 只有一個抽象函數(shù), 那么可以使用Lambda表達式來替換實現(xiàn)類對象
  • 如果一個接口中只有一個抽象函數(shù), 那么這個接口叫做函數(shù)式接口;
  • @FunctionalInterface 這個注解就表示這個接口是一個函數(shù)式接口;
  • Lambda表達式大括號中的代碼是當調(diào)用該接口的抽象方法時, 才會執(zhí)行;

3.Lambda表達式的標準格式

(參數(shù)類型 參數(shù)名, 參數(shù)類型 參數(shù)名,...)->{代碼}

示例代碼一:

new Thread(()->{System.out.println("run()方法中的內(nèi)容");}).start();

示例代碼二

ArrayList<Integer> list = new ArrayList<>();
list.add(500);
list.add(300);
list.add(100);
list.add(400);
list.add(200);
Collections.sort(list,(Integer a,Integer b)->{ return b - a;});

4.Lambda表達式的省略格式

  • 小括號中參數(shù)類型可以省略;
  • 小括號中有且僅有一個參數(shù), 那么參數(shù)類型和小括號可以一起省略;
  • 如果大括號中有且僅有一行代碼, 那么無論是否有返回值, 大括號, return, 分號都可以一起省略;

示例代碼一:

new Thread(()-> System.out.println("run方法中的內(nèi)容")).start();

示例代碼二:

ArrayList<Integer> list = new ArrayList<>();
list.add(500);
list.add(300);
list.add(100);
list.add(400);
list.add(200);
Collections.sort(list, (a, b) -> b - a);

5.Lambda的表現(xiàn)形式

  • 變量的形式

    Runnable runnable = ()-> System.out.println("變量的形式");
    runnable.run();
    
  • 參數(shù)的形式

    // 參數(shù)的形式
    Collections.sort(list, (str1, str2)-> str1.length() - str2.length());
    
  • 返回值的形式

    IA a = method4();
    a.method(1000);
    
    public static IA method4(){
      return a->{System.out.println("返回值形式"+a);};
    }
    
    public interface IA {
      void method(int a);
    }
    

6.方法引用(Jdk1.8新特性)

6.1 什么是方法引用

方法引用就是用來在一定的情況下,替換Lambda表達式; 方法引用使用一對冒號 ::

6.2 方法引用的使用場景

  • 如果一個Lambda表達式大括號中的代碼和另一個方法中的代碼一模一樣,那么就可以使用方法引用把該方法引過來,從而替換Lambda表達式
  • 如果一個Lambda表達式大括號中的代碼就是調(diào)用另一方法,那么就可以使用方法引用把該方法引過來,從而替換Lambda表達式
public class Test {
    public static void printStr(){
        System.out.println("jack");
        System.out.println("jack");
        System.out.println("jack");
        System.out.println("jack");
        System.out.println("jack");
        System.out.println("jack");
    }
    public static void main(String[] args) {
        new Thread(()->{
            System.out.println("jack");
            System.out.println("jack");
            System.out.println("jack");
            System.out.println("jack");
            System.out.println("jack");
            System.out.println("jack");
        }).start(); 
        // run方法中的內(nèi)容,與printStr函數(shù)中的內(nèi)容一樣
        // Lambda表達式寫法
        new Thread(()->{Test.printStr();}).start();
        // 替換Lambda表達式的寫法
        new Thread(Test::printStr).start();
    }
}

6.3 方法引用的分類

6.3.1 構(gòu)造方法引用

public class Person {
    String name;
    public Person() {
    }
    public Person(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                '}';
    }
}
public static void main(String[] args) {
    ArrayList<String> list = new ArrayList<>();
    list.add("楊紫");
    list.add("迪麗熱巴");
    list.add("陳鈺琪");
    // 需求: 把流中的姓名元素,轉(zhuǎn)換成Person對象

    //list.stream().map((String name)->{return  new Person(name);}).forEach(p->
    // System.out.println(p));
    // 以上map方法中的Lambda 表達式,大括號中的代碼就是調(diào)用Person類的構(gòu)造方法
    
    // 如何引用構(gòu)造方法:  類型::new
    list.stream().map(Person::new).forEach(p-> System.out.println(p));
}

6.3.2 靜態(tài)方法引用

public static void main(String[] args) {
    // 如何引用靜態(tài)方法: 類名::方法名
    ArrayList<String> list = new ArrayList<>();
    list.add("110");
    list.add("111");
    list.add("112");

    // 需求:把集合中的元素轉(zhuǎn)換為int類型,打印輸出
    // list.stream().map((String str)->{return Integer.parseInt(str);}).forEach(i-> System.out.println(i+1));
    // 以上map方法中的Lambda表達式,大括號里就是調(diào)用Integer的靜態(tài)方法parseInt
    list.stream().map(Integer::parseInt).forEach(i-> System.out.println(i+1));
}

6.3.3 對象成員方法引用

public static void main(String[] args) {
    // 如何引用對象成員方法: 對象::成員方法名
    // 注意: 這個方法一定是帶有參數(shù)的
    ArrayList<String> list = new ArrayList<>();
    list.add("楊紫");
    list.add("迪麗熱巴");
    list.add("陳鈺琪");

    // 需求:把集合中所有元素打印輸出
    // list.stream().forEach(name-> System.out.println(name));
    // 以上forEach方法中的Lambda表達式,大括號中其實就是調(diào)用PrintStream的成員方法println()
    list.stream().forEach(System.out::println);
}

6.3.4 類的成員方法引用

public static void main(String[] args) {
    // 如何引用類的成員方法: 類名::成員方法名
    // 注意:成員方法不帶參數(shù)的
    ArrayList<String> list = new ArrayList<>();
    list.add("楊紫");
    list.add("迪麗熱巴");
    list.add("陳鈺琪");

    // 需求: 把集合中的元素轉(zhuǎn)換為該元素對應(yīng)的字符長度,打印輸出
    // list.stream().map((String name)->{
    // return name.length();}).forEach(System.out::println);
    // 以上map方法中的Lambda表達式,大括號中就是調(diào)用String類對象的length()方法
    list.stream().map(String::length).forEach(System.out::println);
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纤房,隨后出現(xiàn)的幾起案子肮塞,更是在濱河造成了極大的恐慌耕赘,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件翠储,死亡現(xiàn)場離奇詭異,居然都是意外死亡隘马,警方通過查閱死者的電腦和手機野宜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門扫步,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人匈子,你說我怎么就攤上這事河胎。” “怎么了虎敦?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵仿粹,是天一觀的道長。 經(jīng)常有香客問我原茅,道長吭历,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任擂橘,我火速辦了婚禮晌区,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘通贞。我一直安慰自己朗若,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布昌罩。 她就那樣靜靜地躺著哭懈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茎用。 梳的紋絲不亂的頭發(fā)上遣总,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音轨功,去河邊找鬼旭斥。 笑死,一個胖子當著我的面吹牛古涧,可吹牛的內(nèi)容都是我干的垂券。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼羡滑,長吁一口氣:“原來是場噩夢啊……” “哼菇爪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起柒昏,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤凳宙,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后昙楚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體近速,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡诈嘿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了削葱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奖亚。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖析砸,靈堂內(nèi)的尸體忽然破棺而出昔字,到底是詐尸還是另有隱情,我是刑警寧澤首繁,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布作郭,位于F島的核電站,受9級特大地震影響弦疮,放射性物質(zhì)發(fā)生泄漏夹攒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一胁塞、第九天 我趴在偏房一處隱蔽的房頂上張望咏尝。 院中可真熱鬧,春花似錦啸罢、人聲如沸编检。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽允懂。三九已至,卻和暖如春衩匣,著一層夾襖步出監(jiān)牢的瞬間蕾总,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工舵揭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留谤专,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓午绳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親映之。 傳聞我的和親對象是個殘疾皇子拦焚,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344