Lamda表達(dá)式

轉(zhuǎn)自:https://www.cnblogs.com/hyyq/p/7425666.html

基礎(chǔ)介紹

Lamda表達(dá)式者春,讀作λ表達(dá)式,它實(shí)質(zhì)屬于函數(shù)式編程的概念塔嬉,要理解函數(shù)式編程的產(chǎn)生目的,就要先理解匿名內(nèi)部類租悄。

場景:在使用時(shí)谨究,再實(shí)現(xiàn)具體的業(yè)務(wù)邏輯;

先來看看傳統(tǒng)的匿名內(nèi)部類調(diào)用方式:

interface MyInterface{

    void lMethod();
}
public class Main {

    public static void test(MyInterface myInterface){
        myInterface.lMethod();
    }

    public static void main(String[] args) {
        test(new MyInterface() {
            @Override
            public void lMethod() {
                System.out.println("Hello World!");
            }
        });
    }
}

在主類中的這么幾行代碼泣棋,嵌套幾層就為了輸出一個(gè)Hello World胶哲!是不是很麻煩?但是由于java結(jié)構(gòu)的完整性潭辈,我們還不得不那么做鸯屿,現(xiàn)在JDK1.8來了澈吨。

再來看看使用Lamda表達(dá)式改寫上面的代碼:

interface MyInterface{

    void lMethod();
}
public class Main {

    public static void test(MyInterface myInterface){
        myInterface.lMethod();
    }

    public static void main(String[] args) {
        test(()->System.out.println("Hello World!"));
    }
}

這就是Lamda表達(dá)式語言,為了解決匿名內(nèi)部類繁雜的操作而出現(xiàn)寄摆。

Lamda語法有三種形式:

(參數(shù)) ->單行語句谅辣;
(參數(shù)) ->{多行語句};
(參數(shù)) ->表達(dá)式冰肴;
括號()可以大致理解為就是方法屈藐,里面是參數(shù)變量,在上面的例子中()->System.out.println("Hello World!") 前面的()代表void lMethod()方法熙尉,它沒有入?yún)⒘撸詾榭眨?>后面是一個(gè)單行語句;

如果->后面是多行語句检痰,需要用{ }裝起來包归,每條語句后需要有分號;

->后面也可以是一個(gè)表達(dá)式,如:a+b等铅歼。


(參數(shù)) ->單行語句:

interface MyInterface{

    void lMethod(String str);
}
public class Main {

    public static void test(MyInterface myInterface){
        myInterface.lMethod("Hello World!");//設(shè)置參數(shù)內(nèi)容
    }

    public static void main(String[] args) {
        //首先在()中定義此表達(dá)式里面需要接收變量s公壤,后面的單行語句中就可以使用該變量了
        test((s)->System.out.println(s));
    }
}

(參數(shù)) ->{多行語句}:

interface MyInterface{

    void lMethod(String str);
}
public class Main {

    public static void test(MyInterface myInterface){
        myInterface.lMethod("Hello World!");//設(shè)置參數(shù)內(nèi)容
    }

    public static void main(String[] args) {
        //首先在()中定義此表達(dá)式里面需要接收變量s,后面的多行語句中就可以使用該變量了椎椰。注意:多行語句別少“厦幅;”號
        test((s)->{
            s=s+s;
            System.out.println(s);
        });
    }
}

(參數(shù)) ->表達(dá)式:

interface MyInterface{

    int lMethod(int a,int b);
}
public class Main {

    public static void test(MyInterface myInterface){
        int result=myInterface.lMethod(1,2);//設(shè)置參數(shù)內(nèi)容,接收返回參數(shù)
        System.out.println(result);
    }
    public static void main(String[] args) {

        test((x,y)-> x*y );//調(diào)用方法
        //相當(dāng)于
//        test((x,y)-> {return  x*y;});
    }
}

這樣,Lamda表達(dá)式就看起來很簡單了慨飘,有不有确憨!

匿名內(nèi)部類,我們比較常用的地方在哪兒瓤的?線程類Thread休弃,以前我們可能這樣寫:

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("線程操作!");
    }
});

現(xiàn)在圈膏,使用Lamda表達(dá)式塔猾,簡單寫為:

new Thread(()->System.out.println("線程操作!"));

總結(jié):利用Lamda表達(dá)式是為了避免匿名內(nèi)部類定義過多無用的操作稽坤。


進(jìn)階

建立簡單Bean類丈甸,方面后面的測試

import java.util.ArrayList;
import java.util.List;
 
public class Human {
    private String name;
    private int age;
 
    public Human() {
    }
 
    public Human(String name, int age) {
        this.name = name;
        this.age = age;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
 
    @SuppressWarnings("serial")
    public static List<Human> getAInitHumanList() {
        return new ArrayList<Human>() {
            {
                add(new Human("guorao", 10));
                add(new Human("mako", 12));
                add(new Human("hel", 30));
                add(new Human("lin", 28));
            }
        };
    }
 
}

簡單的排序方法

1、利用實(shí)現(xiàn)Comparator接口方式

public class HumanComparetor implements Comparator<Human> {
    @Override
    public int compare(Human h1, Human h2) {
        if (h1.getAge() > h2.getAge()) {
            return 1;
        } else if (h1.getAge() == h2.getAge()) {
            return 0;
        } else {
            return -1;
        }
    }
}
public static void main(String[] args) {
     List<Human> humans = Human.getAInitHumanList();
     Collections.sort(humans, new HumanComparetor());
     System.out.println(humans);
}

2尿褪、利用內(nèi)部類

public static void main(String[] args) {
    List<Human> humans = Human.getAInitHumanList();
    //方法內(nèi)-局部類
    class HumanComparetor implements Comparator<Human> {
        @Override
        public int compare(Human h1, Human h2) {
            return h1.getAge() - h2.getAge();
        }
    }
    Collections.sort(humans, new HumanComparetor());
    System.out.println(humans);
}

利用新特性

1睦擂、利用lamdba方式

    public static void main(String[] args) {
        List<Human> humans = Human.getAInitHumanList();
        //lamdba 表達(dá)式 ->
        Collections.sort(humans, (Human h1, Human h2) -> h1.getAge() - h2.getAge());
        System.out.println(humans);
    }

2、利用Comparator和lamdba表達(dá)式多條件排序

public static void main(String[] args) {
    List<Human> humans = Human.getAInitHumanList();
    ////lamdba 表達(dá)式 ::
    Collections.sort(humans, Comparator.comparing(Human::getAge).thenComparing(Human::getName));
    System.out.println(humans);
}

3茫多、用Comparator接口方式多條件排序

public static void main(String[] args) {
    List<Human> humans = Human.getAInitHumanList();
    //直接用list.sort
    humans.sort(Comparator.comparing(Human::getAge).thenComparing(Human::getName));
    System.out.println(humans);
}

解釋:Comparable和Comparator

  • 1祈匙、Comparable為內(nèi)部比較類忽刽,是實(shí)現(xiàn)的對象自身與其他對象進(jìn)行比較
object.compareTo(object2)

  • 2天揖、Comparator為外部比較類夺欲,是實(shí)現(xiàn)某種對象之間的屬性、值之間的比較方式今膊;
    其實(shí)Comparator就是一種典型的策略模式些阅;
ComparatorImpl comparator = new ComparatorImpl();
comparator.compare(object1, object2)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市斑唬,隨后出現(xiàn)的幾起案子市埋,更是在濱河造成了極大的恐慌,老刑警劉巖恕刘,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缤谎,死亡現(xiàn)場離奇詭異,居然都是意外死亡褐着,警方通過查閱死者的電腦和手機(jī)坷澡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來含蓉,“玉大人频敛,你說我怎么就攤上這事∠诳郏” “怎么了斟赚?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長差油。 經(jīng)常有香客問我拗军,道長,這世上最難降的妖魔是什么厌殉? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任食绿,我火速辦了婚禮,結(jié)果婚禮上公罕,老公的妹妹穿的比我還像新娘器紧。我一直安慰自己,他們只是感情好楼眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布铲汪。 她就那樣靜靜地躺著,像睡著了一般罐柳。 火紅的嫁衣襯著肌膚如雪掌腰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天张吉,我揣著相機(jī)與錄音齿梁,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛勺择,可吹牛的內(nèi)容都是我干的创南。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼省核,長吁一口氣:“原來是場噩夢啊……” “哼稿辙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起气忠,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤邻储,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旧噪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吨娜,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年淘钟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了萌壳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡日月,死狀恐怖袱瓮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情爱咬,我是刑警寧澤尺借,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站精拟,受9級特大地震影響燎斩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蜂绎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一栅表、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧师枣,春花似錦怪瓶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至陨倡,卻和暖如春敛滋,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兴革。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工绎晃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蜜唾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓庶艾,卻偏偏與公主長得像灵妨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子落竹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評論 2 348

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

  • 早起 嗅一縷晨香 摘來幾朵 細(xì)聞 心扉敞開一天
    燈光下的思索閱讀 264評論 0 0
  • 如果時(shí)光倒流述召,我愿意回到你的年紀(jì), 小時(shí)候蟹地,盼望著長大成人 長大了积暖,卻盼望能夠回到過去 回到那天真無邪,純真爛漫的...
    沐之涵閱讀 436評論 0 0
  • 1怪与、echo輸出命令和腳本執(zhí)行 格式:echo [選項(xiàng)] [輸出內(nèi)容]選項(xiàng): -e:支持反斜線控制的字符轉(zhuǎn)換ech...
    笑Skr人啊閱讀 362評論 0 1
  • 陽春三月夺刑,春和景明,我們踏上了回鄉(xiāng)掃墓的路程分别。柔和的春風(fēng)吹綠了一望無際的麥田遍愿,吹皺了靜靜流淌的小河。明媚的春光把一...
    新月如水閱讀 1,231評論 12 14