為什么使用Lambda表達(dá)式(翻譯版)

1.png
簡(jiǎn)介

如上圖所示旦签,綠色框中就是Lambda表達(dá)式,是可以執(zhí)行的代碼塊肪跋。Lambda表達(dá)式是很多編程語言的特征歧蒋,比如Lisp, Python, Scala等。
但是對(duì)于java州既,在8以后才支持這種寫法谜洽。在此之前,如果想執(zhí)行一個(gè)代碼塊吴叶,我們需要新建一個(gè)對(duì)象褥琐,并傳遞這個(gè)對(duì)象,比如使用策略模式晤郑。java 8以后敌呈,可以把某個(gè)功能視為方法參數(shù)贸宏,并傳遞一個(gè)代碼塊。
對(duì)于java 8來說磕洪,Lambda表達(dá)式的憑借著自身的強(qiáng)大吭练,而備受關(guān)注。
在本文中析显,我將簡(jiǎn)單地介紹下函數(shù)式編程在java 8中的運(yùn)用鲫咽。這是java 8 lambda系列的一部分。

1谷异,java 8以前如何排序

下面將介紹如何使用 comparator 對(duì)自定義數(shù)組的排序分尸。

  • 需要被排序的類:Dog
public class Dog {
    String name;
    int height;
    int weight;
 
    public Dog(String n, int s, int w) {
        this.name = n;
        this.height = s;
        this.weight = w;
    }
 
    public String toString() {
        return getName() + ": size=" + getHeight() + " weight=" + getWeight()
                + " \n";
    }
 
    //setters and getters ... 
}
  • 國(guó)際慣例,為了排序這些狗子歹嘹,打算使用 Arrays.sort(...)箩绍,然而此方法第二個(gè)參數(shù)是一個(gè)比較器(comparator,下同)尺上,所以需要構(gòu)造一個(gè)比較器材蛛,如下是一個(gè)利用策略模式的經(jīng)典例子。
import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Stream;
 
public class ArraysSort {
 
    public static void main(String[] args) {
        Dog d1 = new Dog("Max", 2, 50);
        Dog d2 = new Dog("Rocky", 1, 30);
        Dog d3 = new Dog("Bear", 3, 40);
 
        Dog[] dogArray = { d1, d2, d3 };
        printDogs(dogArray);
 
        Arrays.sort(dogArray, new Comparator<Dog>() {
            @Override
            public int compare(Dog o1, Dog o2) {
                return o1.getWeight() - o2.getWeight();
            }
        });
        printDogs(dogArray);
    }
 
    public static void printDogs(Dog[] dogs) {
        System.out.println("--Dog List--");
        for (Dog d : dogs)
            System.out.print(d);
        System.out.println();
    }
}

2怎抛,通過Lambda表達(dá)式排序

  • 在java 8卑吭,只要如下一行簡(jiǎn)單的代碼實(shí)現(xiàn)
Arrays.sort(dogArray, (Dog m, Dog n) -> m.getWeight() - n.getWeight());
printDogs(dogArray);

(Dog m, Dog n) -> Integer.compare(m.getWeight(), n.getWeight())就是Lambda表達(dá)式。它被偷偷地轉(zhuǎn)換成了比較器對(duì)象马绝。我們可以暫時(shí)把lambda表達(dá)式簡(jiǎn)單地認(rèn)為是一個(gè)方法豆赏。至于lambda表達(dá)式如何轉(zhuǎn)成函數(shù)式接口是一個(gè)復(fù)雜的故事。

3富稻,Lambda表達(dá)式的語法

語法包含一下幾點(diǎn):

  • 以逗號(hào)分隔河绽,以()關(guān)閉的形參:(Dog m, Dog n)
  • 箭頭標(biāo)記:->
  • 主體部分則是一個(gè)單表達(dá)式或者聲明代碼塊。如下是單表達(dá)式形式:- Integer.compare(m.getWeight(), n.getWeight())

當(dāng)然了唉窃,我們也能使用其他不同的方式去寫lambda表達(dá)式的。

4纹笼,Stream 應(yīng)用程序接口

為什么在java 8中纹份,lambda表達(dá)式這么強(qiáng)大?Stream API起了很大作用廷痘。(注:stream不翻譯)在java 8中蔓涧,stream是支持順序和并行聚合操作的元素序列。
通過使用streams笋额,可以簡(jiǎn)單地通過一塊代碼去篩選元暴,并將篩選功能應(yīng)用于stream中的每一個(gè)元素。
對(duì)于上文的狗子排序兄猩,也通過stream實(shí)現(xiàn)茉盏,如下:

import java.util.stream.Stream;
public class Java8WhyLambda {
    public static void main(String[] args) {
        // create an array of dogs
        Dog d1 = new Dog("Max", 2, 50);
        Dog d2 = new Dog("Rocky", 1, 30);
        Dog d3 = new Dog("Bear", 3, 40);
        Dog[] dogArray = { d1, d2, d3 };
 
        // use stream to sort
        Stream<Dog> dogStream = Stream.of(dogArray);
        Stream<Dog> sortedDogStream = dogStream.sorted((Dog m, Dog n) -> Integer.compare(m.getHeight(), n.getHeight()));
 
        sortedDogStream.forEach(d -> System.out.print(d));
    }
}

原文地址: Why do we need Lambda in Java?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鉴未,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸠姨,更是在濱河造成了極大的恐慌铜秆,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件讶迁,死亡現(xiàn)場(chǎng)離奇詭異连茧,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)巍糯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門啸驯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人祟峦,你說我怎么就攤上這事罚斗。” “怎么了搀愧?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵惰聂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我咱筛,道長(zhǎng)搓幌,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任迅箩,我火速辦了婚禮溉愁,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饲趋。我一直安慰自己拐揭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布奕塑。 她就那樣靜靜地躺著堂污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪龄砰。 梳的紋絲不亂的頭發(fā)上盟猖,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音换棚,去河邊找鬼式镐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛固蚤,可吹牛的內(nèi)容都是我干的娘汞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼夕玩,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼你弦!你這毒婦竟也來了惊豺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤鳖目,失蹤者是張志新(化名)和其女友劉穎扮叨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體领迈,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡彻磁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狸捅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衷蜓。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖尘喝,靈堂內(nèi)的尸體忽然破棺而出磁浇,到底是詐尸還是另有隱情,我是刑警寧澤朽褪,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布置吓,位于F島的核電站,受9級(jí)特大地震影響缔赠,放射性物質(zhì)發(fā)生泄漏衍锚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一嗤堰、第九天 我趴在偏房一處隱蔽的房頂上張望戴质。 院中可真熱鬧,春花似錦踢匣、人聲如沸告匠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽后专。三九已至,卻和暖如春输莺,著一層夾襖步出監(jiān)牢的瞬間戚哎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工模闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人崭捍。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓尸折,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親殷蛇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子实夹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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