您好,登录后才能下订单哦!
本篇文章为大家展示了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,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、使用高阶函数的益处
正如你见到的,函数帮助我们干净地将对象的创建和处理区分开来。通过这种方法,新的业务逻辑处理对象就可以轻易的添加进来而没有必要同对象创建逻辑相耦合。
结果就是,我们通过使用高阶函数来使我们的代码保持DRY(Dont'tRepeatYourself)因而,程序员可以从一个非常细粒度的代码重用中获得最佳利益。
上述内容就是Java8和Scala中的高阶函数有哪些,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。