溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

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

發布時間:2021-10-13 09:57:06 來源:億速云 閱讀:171 作者:柒染 欄目:編程語言

本篇文章為大家展示了Java8和Scala中的高階函數有哪些,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

  函數文本最大的優勢就是可以像字符串或者對象等其他文本(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中的高階函數有哪些,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女