本篇文章為大家展示了Java8和Scala中的高階函數(shù)有哪些,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
在興山等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供網(wǎng)站建設(shè)、做網(wǎng)站 網(wǎng)站設(shè)計制作定制設(shè)計,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),成都品牌網(wǎng)站建設(shè),營銷型網(wǎng)站,外貿(mào)營銷網(wǎng)站建設(shè),興山網(wǎng)站建設(shè)費用合理。
函數(shù)文本最大的優(yōu)勢就是可以像字符串或者對象等其他文本(literal)一樣傳送它。這種特性為構(gòu)建高度緊湊和可重用代碼提供無限的可能性。下面創(chuàng)新互聯(lián)小編來講解下Java8和Scala中的高階函數(shù)有哪些?
Java8和Scala中的高階函數(shù)有哪些
當(dāng)我們將一個函數(shù)文本傳送給一個方法的時候,我們最主要的是一個接收方法參數(shù)的方法(這個確實很繞-_-|||),這類方法就叫做高階函數(shù)。上文Swing例子中提到的addActionListener方法恰好屬于這類。我們還可以定義自己的高階函數(shù)來為自己提供許多便利。讓我們看一個簡單的例子:
defmeasure[T](func:=>T):T{
valstart=System.nanoTime()
valresult=func
valelapsed=System.nanoTime()-start;
print("Theexecutionofthiscalltook:%sns".format(elapsed));
result
}
在這個例子中,我們聲明了一個名為measure的方法用來計算這個名為func的函數(shù)文本的回調(diào)所需要的時間。func方法的簽名(signature)是它不接收任何參數(shù)并且返回一個泛型類型T.正如你所看到的,Scala中的函數(shù)并不一定需要參數(shù)盡管它們能夠——而且往往也含有參數(shù)。
現(xiàn)在我們可以向measure方法中傳遞任何函數(shù)文本(或者方法)。
defmyCallback={
Thread.sleep(1000)
"Ijusttookapoewrnap"
}
valresult=measure(myCallback);
>Theexecutionofthiscalltook:100244900ns
從概念的角度講我們所做的,就是將計算方法調(diào)用時間和實際的運算區(qū)分開來。我們構(gòu)造了兩塊可以重用、松散耦合、類似于攔截器(interceptor)的代碼塊(measure和myCallback)
2、通過高階函數(shù)實現(xiàn)重用
先看一個假設(shè)的例子,兩個可重用構(gòu)造略緊耦合:
defdoWithContact(fileName:String,handle:Contact=>Unit):Unit={
try{
valcontactStr=io.Source.fromFile(fileName).mkString
valcontact=AContactParser.parse(contactStr)
handle(contact)
}
catch{
casee:IOException=>println("couldn'tloadcontactfile:"+e);
casee:ParseException=>println("coulnd'tparsecontactfile:"+e);
}
}
Java8和Scala中的高階函數(shù)有哪些
doWithContact方法從文件中讀取電子名片之類的聯(lián)系方式然后將數(shù)據(jù)提供給一個解析器(parser)將數(shù)據(jù)轉(zhuǎn)化成為聯(lián)系領(lǐng)域的對象。然后這個對象被傳遞給一個函數(shù)文本回調(diào)handle.doWithContact方法很函數(shù)文本均返回Unit類型,等同于java中的返回void的方法。
現(xiàn)在,我們可以定義各種各樣的可以傳遞給doWithContact的回調(diào)函數(shù):
valstoreCallback=(c:Contact)=>ContactDao.save(c)
valsendCallback=(c:Contact)=>{
valmsgBody=AConverter.convert(c)
RestService.send(msgBody)
}
valcombineCallback=(c:Contact)=>{
storeCallback(c)
sendCallback(c)
}
doWithContact("custerX.vcf",storeCallback)
doWithContact("custerY.vcf",sendCallback)
doWithContact("custerZ.vcf",combineCallback)
doWithContact("custerZ.vcf",combineCallback)
回調(diào)函數(shù)也可以通過內(nèi)聯(lián)傳遞:
doWithContact("custerW.vcf",(c:Contact)=>ContactDao.save(c))
3、Java8中的高階函數(shù)
java8中的等效實現(xiàn)看起來十分相似——使用目前的語法建議:
publicinterfaceBlock
voidapply(Tt);
}
publicvoiddoWithContact(StringfileName,Block
try{
StringcontacStr=FileUtils.readFileToString(newFile(fileName));
Contact.apply(contact);
block.apply(contact);
}
catch(IOExceptione){
System.out.println("cloudn'tloadcontactfile:"+e.getMessage());
}
catch(ParseExceptione){
System.out.println("cloudn'tparsecontactfile:"+e.getMessage());
}
}
//usage
doWithContact("custerX.vcf",c->ContactDao.save(c))
4、使用高階函數(shù)的益處
正如你見到的,函數(shù)幫助我們干凈地將對象的創(chuàng)建和處理區(qū)分開來。通過這種方法,新的業(yè)務(wù)邏輯處理對象就可以輕易的添加進(jìn)來而沒有必要同對象創(chuàng)建邏輯相耦合。
結(jié)果就是,我們通過使用高階函數(shù)來使我們的代碼保持DRY(Dont'tRepeatYourself)因而,程序員可以從一個非常細(xì)粒度的代碼重用中獲得最佳利益。
上述內(nèi)容就是Java8和Scala中的高階函數(shù)有哪些,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。