Scala有一个当初差点挤掉JAVA地位的东西,就是高阶方法,也叫高阶函数,大家可以想一下JAVA的lambda表达式,或者是函数式接口这些JAVA推出的简化开发的方法,其实JAVA之所以推出这些就是因为Scala和它同用JAVA虚拟机,且开发又比它简单,再不出些东西,JAVA就可以拜拜了
高级方法的本质是将一个方法当做参数传入另一个方法中
举个例子,用JAVA的话想要过滤出一个集合中的东西,那么你需要写一个循环或者其他的工具类,但是Scala不用,Scala提供了高阶方法,你只需要提供一个处理的方法就可以了
package com.wy
object CollectionTest {
def main(args: Array[String]): Unit = {
var mymap = Map("book"->5,"pen"->2,"chizi"->6)
//val filter: Map[String, Int] = mymap.filter(tmp=>(tmp._2>=5))
val filter: Map[String, Int] = mymap.filter(_._2>=5)
//println(filter)
val mapreuslt: Map[String, Int] = mymap.map(tmp => tmp._1->tmp._2*2)
//println(mapreuslt)
val forechresult: Unit = mymap.foreach(tmp => println(tmp._1+"的值是:"+tmp._2))
}
}
当然上面的这个例子目的是告诉大家,我们可以使用其他厂商的API提供的高阶方法,我们需要的时候直接调用就可以了,我现在想给大家演示的是高阶函数内部到底是什么东西,因为我们肯定会遇到需要写自己的高阶函数的时候
首先我先给大家分析一下,高级函数的样子,下面是我写的一个高阶函数,用来给大家解释一下
def p(f: Int => String, v: Int){
println(v)
}
首先不看参数,那么p方法其实就是一个接受两个参数,内部打印的普通方法
使它成为高阶方法的是f: Int => String这个参数,这是一个参数样式方法的表达式,也是高级方法接受其他方法时的表达式,下面简称参数方法
f: Int => String
这个表达式中f是参数方法的名字,Int指的是这个方法有一个Int型参数,=> String表示返回值是String,当然如果参数不止一个那么定义的时候,参数方法的参数位要用小括号包裹参数,比如
f: (Int,Float) => String
不过大家应该发现了,这个表达式,有名字、参数、返回值,但是没有方法体,其实这是因为这个表达式,只是规定了可传入方法的一个样子,当我们使用的时候只要符合这个样子的参数就可以使用,下面我给大家准备了一个单参数匿名方法,用来演示高级函数的使用,如下
val fun=(x:Int)=>{println(x)}
//单参数或者方法体代码只有一个或者一行时括号和花括号都可以看情况省略
//如果大家写的时候在赋值上报错,那么是scala jdk版本问题,大家用一个括号包裹匿名方法就可以赋值了
为了方便使用我将它赋值给了常量fun,下面我们来使用它
package com.dtdream.driver
object TTT {
def main(args: Array[String]): Unit = {
//1、装备一个匿名方法,作用是拼接之后返回
val fun=(x:Int)=>{x+"高阶函数内部拼接"}
//2、上面的方法做参 调用高阶方法
println(p(fun,21))
}
//3、高阶方法 指定返回值是因为要把值返回到main方法中
def p(fun: Int => String, v: Int):String= {
//4、实现逻辑
fun(v)
}
}
效果:
那现在可能还有些小伙伴没有反应过来,感觉和最前面的那个例子不一样,毕竟我们使用其他API提供的高阶方法时好像没有我准备的那个匿名方法
其实啊!这个是因为我们正常用的时候直接用了表达式,就拿我这个例子来说我完全可以不用先写那个匿名方法,直接在调用高阶函数的时候写成如下格式
//用平常的写法写
println(p(_+"高阶函数内部拼接",21))
//完整的写法
println(p(m=>{m+"高阶函数内部拼接"},21))
以上就是我要给大家分享的Scala的高阶方法,希望可以帮到大家