我今天開始學習方法報價,它是lambda運算式的進一步簡化版本,語法應該更簡潔,
1.方法參考
有一個需求:
將字串中的所有資訊轉換為大寫字母,然后將其列印出來,
使用功能性編程思想撰寫代碼,
1.Lambda運算式撰寫
①功能界面可列印
這是一個帶有抽象方法printMsg()的自定義列印介面,用于列印資訊
②lambda運算式
method方法中有兩個引數,lambda運算式表示介面的實作類物件,在lambda運算式中,已經撰寫了業務邏輯,
什么是業務邏輯?
我的理解是方法的內容:根據什么引數獲得什么結果,
在上面的示例中:根據傳遞的字串訊息(即引數msg)
結果是將所有味精更改為大寫字母(msg.toUpperCase)
這是業務邏輯,當然,我給出的示例非常簡單,實際上它必須復雜得多,
2.方法參考
方法參考用于替換更簡潔的lambda運算式,從某種意義上說,它們具有相似的功能,
①方法參考
具體格式為:newMyPrint()::printMsg
核心是雙冒號“::”,如何理解這種格式?
可以理解,MyPrint物件正在呼叫printMsg方法,
為什么可以這種方式直接使用它?因為它的邏輯已經存在,即MyPrint類中的PrintMsg方法及其業務邏輯
②業務邏輯
將字串msg更改為所有大寫字母,這等效于重寫MyPrint類的介面中的abstract方法,
3.方法參考和lambda運算式:
現在的問題來了:方法不是參考了lambda運算式的簡化形式嗎?您如何看待代碼變得越來越麻煩?
讓我們看一下①,方法參考比lambda運算式更簡單嗎?
如果使用方法參考,則無論使用多少次業務邏輯,我都只需撰寫一次,然后在其他時間直接呼叫它;
如果使用lambda運算式,則每次呼叫時都要撰寫業務邏輯,
因此,該方法參考的簡潔之處在于不必重復撰寫相同的邏輯,
通過這種方式可以理解,方法參考比lambda運算式簡單得多,尤其是在業務邏輯非常復雜的情況下
當然,方法參考的前提是:業務邏輯已經存在,
如果邏輯已經存在,我可以使用方法參考,
如果邏輯不存在,請乖乖地撰寫lambda運算式,
二,其他方法參考
上例中的方法參考是物件參考方法,除物件參考外,還有許多其他方法,
1.類名參考
如果它是靜態方法,則可以使用類名直接呼叫該方法,
Java的底層已經撰寫了很多工具類,其大多數方法都是靜態方法,直接使用方法參考更為方便,
Math是一個工具類,它具有一個靜態方法abs(),
因此,方法參考直接用類名參考了abs方法,因為其中的邏輯已經在Java的底部撰寫了,
類名參考格式如下:
lambda運算式:number->Math.abs(number)
方法參考:Math::abs
當然,方法參考也有局限性,例如,我現在需要絕對值的10倍,
lambda運算式直接更改業務邏輯,
但是無法使用方法參考,因為Java底部沒有這樣的業務邏輯,即使我們需要使用方法參考,我們也必須首先撰寫邏輯,
2.通過此參考成員方法
撰寫這樣的代碼只是為了獲得良好的觀看效果,這不是標準的做法,因此它們是一起撰寫的,
此參考格式如下:
lambda運算式:name->this.introduce(name)
方法參考:this::introduce
在這方面,這是此類的代表,此類中已經有一個介紹方法,然后,我使用它來參考此類中的相應方法,
3.通過super參考成員的方法
如果MyClass具有父類,則具有fuIntroduce方法,如果要參考此方法,則可以使用super關鍵字,
用法與此相同,因此不再贅述,
超級參考格式如下:
lambda運算式:name->super.fuIntroduce(name)
方法參考:super::fuIntroduce
Super代表父類,并且父類中已經有fuIntroduce方法,然后我使用super來參考父類中的相應方法,
4.類建構式參考
類結構具有以下格式:
lambda運算式:name->newPerson(name)
方法參考:Person::new
Person::new等效于創建物件(newPerson())
不要看這段代碼的復雜性,實際上它等同于新物件,
當然,對類建構式的理解并不充分,暫時,只需記住方法參考并使用它來創建物件,
5.陣列建構式參考
陣列也是Object的子類,因此它們也具有建構式,但是語法略有不同,
陣列建構式的格式如下:
lambda運算式:length->newint[length]
方法參考:int[]::new
與類建構式相同的原因:
int[]::new等效于創建一個陣列(newint[length])
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/174394.html
標籤:Java
下一篇:Java入門選什么方向
