今天是劉小愛自學Java的第48天。
感謝你的觀看,謝謝你。
話不多說,開始今天的學習:
昨天回顧了函數式編程的一些概念。
今天開始學習方法引用,它是lambda表達式的進一步簡化版,語法還要更加地簡潔。
現有一個需求:
將一個字符串信息全部轉換成大寫字母,再打印出來。
利用函數式編程思想編寫代碼。
1.lambda表達式編寫
①函數式接口Printable
這是一個自定義的打印接口,有一個打印信息的抽象方法printMsg()
②lambda表達式
method方法中有兩個參數,用lambda表達式表示的是接口的實現類對象。并且在lambda表達式中,業務邏輯已經寫出來了。
什么叫業務邏輯?
我的理解是方法內容:根據什么參數得到了什么結果。
上述例子中就是:根據傳過來的字符串消息(也就是參數msg)
結果將msg全部變成大寫字母(msg.toUpperCase)
這就是業務邏輯,當然我舉的這個例子非常簡單,現實里肯定要復雜的多。
2.方法引用
方法引用是用來代替lambda表達式的,更加地簡潔,從某種意義上來說,它們的作用其實是差不多的。
①方法引用
具體格式為:new MyPrint()::printMsg
核心是這個雙冒號“::”,如何理解這個格式?
就可以理解成是MyPrint對象在調用printMsg方法。
為什么它能直接這樣使用?因為它的邏輯已經存在,也就是MyPrint類中有printMsg方法以及其業務邏輯
②業務邏輯
將字符串msg全部變成大寫字母,這就相當于是在MyPrint類中重寫了接口中的抽象方法。
3.方法引用和lambda表達式:
現在問題來了:方法引用不是對lambda表達式的簡化么?怎么感覺代碼還越來越繁瑣了?
我們只看①而言,方法引用要比lambda表達式簡單吧?
如果我使用方法引用,該業務邏輯無論被使用多少次,我只需要寫一次,其它時候直接調用;
如果我是用lambda表達式,我每調用一次就要將業務邏輯寫一遍。
所以方法引用的簡潔之處在于相同邏輯不需要重復地寫。
這樣理解下來,方法引用要比lambda表達式簡潔很多,尤其是在業務邏輯很復雜的時候
當然方法引用的前提:業務邏輯已經存在。
如果邏輯已經存在,我直接使用方法引用即可,
如果邏輯不存在,還是乖乖地寫lambda表達式。
上述例子中的方法引用是對象在引用方法,除了對象引用之外還有很多其它方式。
1.類名引用
如果是靜態方法,直接用類名就可以調用方法。
Java底層中已經寫好了很多工具類,其大多數方法都是靜態方法,直接使用方法引用會方便很多。
Math是一個工具類,它有一個靜態方法abs()。
所以方法引用直接用類名引用abs方法,因為其中的邏輯在Java底層就已經寫好了。
類名引用格式如下:
lambda表達式:number->Math.abs(number)
方法引用:Math::abs
當然這里面方法引用也有一個局限性,比如說我現在要求得到10倍的絕對值。
lambda表達式直接改業務邏輯就好了;
但是方法引用沒辦法,因為Java底層沒有這樣的業務邏輯,就算要用方法引用,我們也得先將邏輯寫出來。
2.通過this引用成員方法
代碼這樣寫并不規范,只是為了好觀看,所以將它們寫在一起了。
this引用格式如下:
lambda表達式:name->this.introduce(name)
方法引用:this::introduce
這里面this就是代表本類,本類中已經有introduce方法了,那我用this引用的就是本類中對應的方法。
3.通過super引用成員方法
如果MyClass有個父類,它里面有一個fuIntroduce方法,若是要引用該方法,可以使用super關鍵字。
使用方式和this是一樣的,就不再闡述了。
super引用格式如下:
lambda表達式:name->super.fuIntroduce(name)
方法引用:super::fuIntroduce
super就是代表父類,父類中已經有fuIntroduce方法了,那我用super引用的就是父類中對應的方法。
4.類的構造器引用
類構造其格式如下:
lambda表達式:name->new Person(name)
方法引用:Person::new
Person::new就相當于創建對象(new Person())
不要看這代碼寫的這么復雜,其實上就相當于new對象。
當然類的構造器這一塊理解的還不算透徹,暫且只需要記住方法引用這樣使用就是在創建對象就好了。
5.數組的構造器引用
數組也是Object的子類對象,所以同樣具有構造器,只是語法稍有不同。
數組構造器格式如下:
lambda表達式:length->new int[length]
方法引用:int[]::new
和類的構造器是一樣的道理:
int[]::new就相當于創建數組(new int[length])