Java8和Scala中的高阶函数有哪些
创始人
2024-12-19 00:40:45
0次

  函数文本最大的优势就是可以像字符串或者对象等其他文本(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)因而,程序员可以从一个非常细粒度的代码重用中获得最佳利益。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...