day05(1)函數(shù)式接口耙饰,函數(shù)式編程

函數(shù)式接口

函數(shù)式接口在Java中是指:有且僅有一個(gè)抽象方法的接口纹笼。
當(dāng)然接口中可以包含其他的方法(默認(rèn),靜態(tài),私有)

函數(shù)式接口,即適用于函數(shù)式編程場(chǎng)景的接口苟跪。而Java中的函數(shù)式編程體現(xiàn)就是Lambda廷痘,所以函數(shù)式接口就是可 以適用于Lambda使用的接口。只有確保接口中有且僅有一個(gè)抽象方法件已,Java中的Lambda才能順利地進(jìn)行推導(dǎo)笋额。
備注:“語(yǔ)法糖”是指使用更加方便,但是原理不變的代碼語(yǔ)法篷扩。例如在遍歷集合時(shí)使用的for-each語(yǔ)法兄猩,其實(shí) 底層的實(shí)現(xiàn)原理仍然是迭代器,這便是“語(yǔ)法糖”鉴未。從應(yīng)用層面來(lái)講枢冤,Java中的Lambda可以被當(dāng)做是匿名內(nèi)部 類的“語(yǔ)法糖”,但是二者在原理上是不同的铜秆。

@FunctionalInterface注解

作用:可以檢測(cè)接口是否是一個(gè)函數(shù)式接口
是:編譯成功
否:編譯失敗(接口中沒(méi)有抽象方法抽象方法的個(gè)數(shù)多余1個(gè))

函數(shù)式接口的使用:一般可以作為方法的參數(shù)和返回值類型

定義一個(gè)方法,參數(shù)使用函數(shù)式接口MyFunctionalInterface
    public static void show(MyFunctionalInterface myInter){
        myInter.method();
    }

    public static void main(String[] args) {
//1.調(diào)用show方法,方法的參數(shù)是一個(gè)接口,所以可以傳遞接口的實(shí)現(xiàn)類對(duì)象
        show(new MyFunctionalInterfaceImpl());

//2.調(diào)用show方法,方法的參數(shù)是一個(gè)接口,所以我們可以傳遞接口的匿名內(nèi)部類
        show(new MyFunctionalInterface() {
            @Override
            public void method() {
                System.out.println("使用匿名內(nèi)部類重寫(xiě)接口中的抽象方法");
            }
        });

//3.調(diào)用show方法,方法的參數(shù)是一個(gè)函數(shù)式接口,所以我們可以Lambda表達(dá)式
        show(()->{
            System.out.println("使用Lambda表達(dá)式重寫(xiě)接口中的抽象方法");
        });
        //簡(jiǎn)化Lambda表達(dá)式
        show(()-> System.out.println("使用Lambda表達(dá)式重寫(xiě)接口中的抽象方法"));
    }

函數(shù)式編程

Lambda的延遲執(zhí)行

有些場(chǎng)景的代碼執(zhí)行后淹真,結(jié)果不一定會(huì)被使用,從而造成性能浪費(fèi)连茧。而Lambda表達(dá)式是延遲執(zhí)行的核蘸,這正好可以 作為解決方案,提升性能梅屉。
例:
使用Lambda優(yōu)化日志案例
Lambda的特點(diǎn):延遲加載
Lambda的使用前提,必須存在函數(shù)式接口

public class Demo02Lambda {
    //定義一個(gè)顯示日志的方法,方法的參數(shù)傳遞日志的等級(jí)和MessageBuilder接口
    public static void showLog(int level, MessageBuilder mb){
        //對(duì)日志的等級(jí)進(jìn)行判斷,如果是1級(jí),則調(diào)用MessageBuilder接口中的builderMessage方法
        if(level==1){
            System.out.println(mb.builderMessage());
        }
    }

    public static void main(String[] args) {
        //定義三個(gè)日志信息
        String msg1 = "Hello";
        String msg2 = "World";
        String msg3 = "Java";
//調(diào)用showLog方法,參數(shù)MessageBuilder是一個(gè)函數(shù)式接口,所以可以傳遞Lambda表達(dá)式
        showLog(1,()->{
            System.out.println("不滿足條件不執(zhí)行");
            //返回一個(gè)拼接好的字符串
            return  msg1+msg2+msg3;
        });
    }
}

使用Lambda表達(dá)式作為參數(shù)傳遞,僅僅是把參數(shù)傳遞到showLog方法中
只有滿足條件,日志的等級(jí)是1級(jí)
才會(huì)調(diào)用接口MessageBuilder中的方法builderMessage
才會(huì)進(jìn)行字符串的拼接
如果條件不滿足,日志的等級(jí)不是1級(jí)
那么MessageBuilder接口中的方法builderMessage也不會(huì)執(zhí)行
所以拼接字符串的代碼也不會(huì)執(zhí)行
所以不會(huì)存在性能的浪費(fèi)值纱。

使用Lambda作為參數(shù)和返回值

例如java.lang.Runnable接口就是一個(gè)函數(shù)式接口,
假設(shè)有一個(gè)startThread方法使用該接口作為參數(shù)坯汤,那么就可以使用Lambda進(jìn)行傳參虐唠。
這種情況其實(shí)和Thread類的構(gòu)造方法參數(shù)為Runnable沒(méi)有本質(zhì)區(qū)別。

    //定義一個(gè)方法startThread,方法的參數(shù)使用函數(shù)式接口Runnable
    public static void startThread(Runnable run){
        //開(kāi)啟多線程
        new Thread(run).start();
    }
    public static void main(String[] args) {
        //調(diào)用startThread方法,方法的參數(shù)是一個(gè)接口,那么我們可以傳遞這個(gè)接口的匿名內(nèi)部類
        startThread(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"-->"+"線程啟動(dòng)了");
            }
        });

        //調(diào)用startThread方法,方法的參數(shù)是一個(gè)函數(shù)式接口,所以可以傳遞Lambda表達(dá)式
        startThread(()->{
            System.out.println(Thread.currentThread().getName()+"-->"+"線程啟動(dòng)了");
        });

        //優(yōu)化Lambda表達(dá)式
        startThread(()->System.out.println(Thread.currentThread().getName()+"-->"+"線程啟動(dòng)了"));
    }

如果一個(gè)方法的返回值類型是一個(gè)函數(shù)式接口惰聂,那么就可以直接返回一個(gè)Lambda表達(dá)式疆偿。
當(dāng)需要通過(guò)一個(gè)方法來(lái)獲取一個(gè)java.util.Comparator接口類型的對(duì)象作為排序器時(shí),就可以調(diào)該方法獲取。

//定義一個(gè)方法,方法的返回值類型使用函數(shù)式接口Comparator
    public static Comparator<String> getComparator(){
        //方法的返回值類型是一個(gè)接口,那么我們可以返回這個(gè)接口的匿名內(nèi)部類
        return new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //按照字符串的降序排序
                return o2.length()-o1.length();
            }
        };

        //方法的返回值類型是一個(gè)函數(shù)式接口,所有我們可以返回一個(gè)Lambda表達(dá)式
        return (String o1, String o2)->{
            //按照字符串的降序排序
            return o2.length()-o1.length();
        };

        //繼續(xù)優(yōu)化Lambda表達(dá)式
        return (o1, o2)->o2.length()-o1.length();
    }

    public static void main(String[] args) {
        //創(chuàng)建一個(gè)字符串?dāng)?shù)組
        String[] arr = {"aaa","b","cccccc","dddddddddddd"};
        //輸出排序前的數(shù)組
        System.out.println(Arrays.toString(arr));//[aaa, b, cccccc, dddddddddddd]
        //調(diào)用Arrays中的sort方法,對(duì)字符串?dāng)?shù)組進(jìn)行排序
        Arrays.sort(arr,getComparator());
        //輸出排序后的數(shù)組
        System.out.println(Arrays.toString(arr));//[dddddddddddd, cccccc, aaa, b]
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末搓幌,一起剝皮案震驚了整個(gè)濱河市杆故,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌溉愁,老刑警劉巖处铛,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡撤蟆,警方通過(guò)查閱死者的電腦和手機(jī)奕塑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)家肯,“玉大人龄砰,你說(shuō)我怎么就攤上這事√忠拢” “怎么了换棚?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)反镇。 經(jīng)常有香客問(wèn)我固蚤,道長(zhǎng),這世上最難降的妖魔是什么愿险? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任颇蜡,我火速辦了婚禮,結(jié)果婚禮上辆亏,老公的妹妹穿的比我還像新娘风秤。我一直安慰自己,他們只是感情好扮叨,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布缤弦。 她就那樣靜靜地躺著,像睡著了一般彻磁。 火紅的嫁衣襯著肌膚如雪碍沐。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天衷蜓,我揣著相機(jī)與錄音累提,去河邊找鬼。 笑死磁浇,一個(gè)胖子當(dāng)著我的面吹牛斋陪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播置吓,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼无虚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了衍锚?” 一聲冷哼從身側(cè)響起友题,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戴质,沒(méi)想到半個(gè)月后度宦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體踢匣,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年斗埂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了符糊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呛凶,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出行贪,到底是詐尸還是另有隱情漾稀,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布建瘫,位于F島的核電站崭捍,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏啰脚。R本人自食惡果不足惜殷蛇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望橄浓。 院中可真熱鬧粒梦,春花似錦、人聲如沸荸实。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)准给。三九已至泄朴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間露氮,已是汗流浹背祖灰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畔规,地道東北人局扶。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像油讯,于是被迫代替她去往敵國(guó)和親详民。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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