方法引用:使用起來最簡潔的Java語法
2022-08-27由 劉小愛 發表于 漁業
java絕對值怎麼表示
今天是劉小愛自學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])
總結: