現在的位置: 首頁 > 編程語言 > 正文

Java8和Scala中的高階函數有哪些

2020年06月05日 編程語言 ⁄ 共 2641字 ⁄ 字型大小 評論關閉

  函數文本最大的優勢就是可以像字元串或者對象等其他文本(literal)一樣傳送它。這種特性為構建高度緊湊和可重用代碼提供無限的可能性。下面學步園小編來講解下Java8和Scala中的高階函數有哪些?

  Java8和Scala中的高階函數有哪些

  當我們將一個函數文本傳送給一個方法的時候,我們最主要的是一個接收方法參數的方法(這個確實很繞-_-|||),這類方法就叫做高階函數。上文Swing例子中提到的addActionListener方法恰好屬於這類。我們還可以定義自己的高階函數來為自己提供許多便利。讓我們看一個簡單的例子:

  defmeasure[T](func:=>T):T{

  valstart=System.nanoTime()

  valresult=func

  valelapsed=System.nanoTime()-start;

  print("Theexecutionofthiscalltook:%sns".format(elapsed));

  result

  }

  在這個例子中,我們聲明了一個名為measure的方法用來計算這個名為func的函數文本的回調所需要的時間。func方法的簽名(signature)是它不接收任何參數並且返回一個泛型類型T.正如你所看到的,Scala中的函數並不一定需要參數儘管它們能夠——而且往往也含有參數。

  現在我們可以向measure方法中傳遞任何函數文本(或者方法)。

  defmyCallback={

  Thread.sleep(1000)

  "Ijusttookapoewrnap"

  }

  valresult=measure(myCallback);

  >Theexecutionofthiscalltook:100244900ns

  從概念的角度講我們所做的,就是將計算方法調用時間和實際的運算區分開來。我們構造了兩塊可以重用、鬆散耦合、類似於攔截器(interceptor)的代碼塊(measure和myCallback)

  2、通過高階函數實現重用

  先看一個假設的例子,兩個可重用構造略緊耦合:

  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中的高階函數有哪些

  doWithContact方法從文件中讀取電子名片之類的聯繫方式然後將數據提供給一個解析器(parser)將數據轉化成為聯繫領域的對象。然後這個對象被傳遞給一個函數文本回調handle.doWithContact方法很函數文本均返回Unit類型,等同於java中的返回void的方法。

  現在,我們可以定義各種各樣的可以傳遞給doWithContact的回調函數:

  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)

  回調函數也可以通過內聯傳遞:

  doWithContact("custerW.vcf",(c:Contact)=>ContactDao.save(c))

  3、Java8中的高階函數

  java8中的等效實現看起來十分相似——使用目前的語法建議:

  publicinterfaceBlock{

  voidapply(Tt);

  }

  publicvoiddoWithContact(StringfileName,Blockblock){

  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、使用高階函數的益處

  正如你見到的,函數幫助我們乾淨地將對象的創建和處理區分開來。通過這種方法,新的業務邏輯處理對象就可以輕易的添加進來而沒有必要同對象創建邏輯相耦合。

  結果就是,我們通過使用高階函數來使我們的代碼保持DRY(Dont'tRepeatYourself)因而,程序員可以從一個非常細粒度的代碼重用中獲得最佳利益。

  以上就是關於「Java8和Scala中的高階函數有哪些」的內容,希望對大家有用。更多資訊請關注學步園。學步園,您學習IT技術的優質平台!

抱歉!評論已關閉.