Java lambda表達(dá)式

1. Java函數(shù)式接口

Java實(shí)現(xiàn)函數(shù)式編程的方式是函數(shù)式接口(functional interface),函數(shù)式接口簡(jiǎn)單來說决乎,是只包含一個(gè)抽象方法的接口。比如Java標(biāo)準(zhǔn)庫中的java.lang.Runnable和 java.util.Comparator都是典型的函數(shù)式接口。
java 8提供 @FunctionalInterface作為函數(shù)式接口的注解,該注解非強(qiáng)制使用嬉探,主要防止團(tuán)隊(duì)的其他人員錯(cuò)誤地往接口中添加新的方法。

2. lambda表達(dá)式

lambda表達(dá)式是匿名方法棉圈,是函數(shù)式接口的匿名實(shí)現(xiàn)涩堤。
使用lambda表達(dá)式實(shí)現(xiàn)Runnable例子:

// 使用匿名內(nèi)部類  
new Thread(new Runnable() {  
    public void run() {  
        System.out.println("Hello world !");  
    }  
}).start();    
// 使用 lambda 表達(dá)式
new Thread(() -> System.out.println("Hello world !")).start();

3. lambda語法

(parameters) -> expression
或者
(parameters) -> { statements; }

JButton jb=new JButton();
jb.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("press button");
    }
});
jb.addActionListener((ActionEvent e)->{System.out.println("press button");});
jb.addActionListener((e)->{System.out.println("press button");});
jb.addActionListener((x)->System.out.println("press button"));
jb.addActionListener(x->System.out.println("press button"));

為了更好的支持lambda,Java8引入了一個(gè)新包java.util.function分瘾,它里面包含了常用的函數(shù)式接口胎围,例如:

Predicate<T>——接收T對(duì)象并返回boolean
Consumer<T>——接收T對(duì)象,不返回值
Function<T, R>——接收T對(duì)象芹敌,返回R對(duì)象
Supplier<T>——提供T對(duì)象(例如工廠)痊远,不接收值
UnaryOperator<T>——接收T對(duì)象垮抗,返回T對(duì)象
BinaryOperator<T>——接收兩個(gè)T對(duì)象氏捞,返回T對(duì)象

在參數(shù)為這些接口的地方,我們就可以直接使用lambda表達(dá)式了冒版!

4. 方法引用(Method references)

lambda表達(dá)式允許我們定義一個(gè)匿名方法液茎,并允許我們以函數(shù)式接口的方式使用它。我們也希望能夠在已有的方法上實(shí)現(xiàn)同樣的特性辞嗡。

方法引用和lambda表達(dá)式擁有相同的特性(例如捆等,它們都需要一個(gè)目標(biāo)類型,并需要被轉(zhuǎn)化為函數(shù)式接口的實(shí)例)续室,不過我們并不需要為方法引用提供方法體栋烤,我們可以直接通過方法名稱引用已有方法。
以下面的代碼為例挺狰,假設(shè)我們要按照name為Person數(shù)組進(jìn)行排序:

class Person {
  private final String name;
  private final int age;

  public int getAge() { return age; }
  public String getName() {return name; }
  ...
}

Person[] people = ...
Comparator<Person> byName = Comparator.comparing(p -> p.getName());
Arrays.sort(people, byName);

在這里我們可以用方法引用代替lambda表達(dá)式:

Comparator<Person> byName = Comparator.comparing(Person::getName);

方法引用的形式
方法引用的標(biāo)準(zhǔn)形式是:類名::方法名明郭。(注意:只需要寫方法名,不需要寫括號(hào))

有以下四種形式的方法引用:

引用靜態(tài)方法
引用某個(gè)對(duì)象的實(shí)例方法
引用某個(gè)類型的任意對(duì)象的實(shí)例方法
引用構(gòu)造方法

  • 引用靜態(tài)方法
    ContainingClass::staticMethodName
    例子: String::valueOf丰泊,對(duì)應(yīng)的Lambda:(s) -> String.valueOf(s)
    比較容易理解薯定,和靜態(tài)方法調(diào)用相比,只是把.換為::
  • 引用特定對(duì)象的實(shí)例方法
    containingObject::instanceMethodName
    例子: x::toString瞳购,對(duì)應(yīng)的Lambda:() -> this.toString()
    與引用靜態(tài)方法相比话侄,都換為實(shí)例的而已
  • 引用特定類型的任意對(duì)象的實(shí)例方法
    ContainingType::methodName
    例子: String::toString,對(duì)應(yīng)的Lambda:(s) -> s.toString()
    實(shí)例方法要通過對(duì)象來調(diào)用,方法引用對(duì)應(yīng)Lambda年堆,Lambda的第一個(gè)參數(shù)會(huì)成為調(diào)用實(shí)例方法的對(duì)象吞杭。
  • 引用構(gòu)造函數(shù)
    ClassName::new
    例子: String::new,對(duì)應(yīng)的Lambda:() -> new String()
    構(gòu)造函數(shù)本質(zhì)上是靜態(tài)方法嘀韧,只是方法名字比較特殊篇亭。

寫個(gè)例子幫本節(jié)內(nèi)容串一下幫助理解:

class Person {
    Integer age;
    public static int compareByAge(Person a,Person b){return a.age.compareTo(b.age);}
    public int compareByAge2(Person b){return age.compareTo(b.age);}

    public static int compareBy18(Person p){return p.age.compareTo(18);}
    public int compareBy14(){return age.compareTo(14);}
}
public void sort(){
    Person [] persons=new Person[10];
    //使用匿名類
    Arrays.sort(persons, new Comparator<Person>() {
                public int compare(Person o1, Person o2) {
                    return o1.age.compareTo(o2.age);
                }
     });
    //使用lambda表達(dá)式
    Arrays.sort(persons, (o1, o2) -> o1.age.compareTo(o2.age));
    //使用lambda表達(dá)式和類的靜態(tài)方法
    Arrays.sort(persons, (o1, o2) -> Person.compareByAge(o1,o2));
    //使用lambda表達(dá)式和實(shí)例方法
    Arrays.sort(persons, (o1, o2) -> o1.compareByAge2(o2));

    //使用方法引用
    //引用的是類的靜態(tài)方法
    Arrays.sort(persons, Person::compareByAge);
    //引用特定類型的任意對(duì)象的實(shí)例方法
    Arrays.sort(persons, Person::compareByAge2);
    //引用的是類的靜態(tài)方法
    Arrays.sort(persons,Comparator.comparing(Person::compareBy18));
    //引用特定類型的任意對(duì)象的實(shí)例方法
    Arrays.sort(persons,Comparator.comparing(Person::compareBy14));
}

`

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市锄贷,隨后出現(xiàn)的幾起案子译蒂,更是在濱河造成了極大的恐慌,老刑警劉巖谊却,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件柔昼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡炎辨,警方通過查閱死者的電腦和手機(jī)捕透,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來碴萧,“玉大人乙嘀,你說我怎么就攤上這事∑朴鳎” “怎么了虎谢?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)曹质。 經(jīng)常有香客問我婴噩,道長(zhǎng),這世上最難降的妖魔是什么羽德? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任几莽,我火速辦了婚禮,結(jié)果婚禮上宅静,老公的妹妹穿的比我還像新娘章蚣。我一直安慰自己,他們只是感情好姨夹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布纤垂。 她就那樣靜靜地躺著,像睡著了一般匀伏。 火紅的嫁衣襯著肌膚如雪洒忧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天够颠,我揣著相機(jī)與錄音熙侍,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蛉抓,可吹牛的內(nèi)容都是我干的庆尘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼巷送,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼驶忌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起笑跛,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤付魔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后飞蹂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體几苍,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年陈哑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妻坝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惊窖,死狀恐怖刽宪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情界酒,我是刑警寧澤圣拄,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站盾计,受9級(jí)特大地震影響售担,放射性物質(zhì)發(fā)生泄漏赁遗。R本人自食惡果不足惜署辉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岩四。 院中可真熱鬧哭尝,春花似錦、人聲如沸剖煌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耕姊。三九已至桶唐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茉兰,已是汗流浹背尤泽。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坯约。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓熊咽,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親闹丐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子横殴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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