在Scala中函数也是有类型的,这是Scala语言提供的一个非常重要的语法,在高阶函数中我们常常会将函数对象做为一个函数的参数
//定义一个函数,该函数参数类型为函数类型
scala> def test(x:Double=>Int)=x(6.0)
test: (x: Double => Int)Int
scala> def double2int(x:Double)=x.toInt
double2int: (x: Double)Int
//函数作为参数进行传递
scala> test(double2int)
res5: Int = 6
代码def test(x:Double=>Int)=x(6.0)定义了一个高阶函数,该函数的参数为函数类型Double=>Int,表示传入的函数输入类型为Double,返回值为Int类型,def double2int(x:Double)=x.toInt定义了这样一个函数,然后作为参数传递给test函数:test(double2int)。事实上,Double=>Int类型的函数有具体的类Function1[Double,Int]与其对应
//通过类Function1创建函数对象
scala> val double2int=new Function1[Double,Int] {
defapply(x:Double):Int=x.toInt
}
double2int: Double => Int = <function1>
scala> test(double2int)
res6: Int = 6
除此之外,Scala中存在FunctionN[T1,T2,….TN+1]个函数类型,其中N最大值为22,之所以最大值为22是因为如果你设计的函数有超过22个参数类型,最大的问题可能在你的函数设计上,此时你需要对代码进行重构。
下面再举个函数类型的例子,让大家对函数类型有个更深入的感受
//创建函数类型对象sum
scala> val sum=new Function2[Int,Int,Int] {
defapply(x:Int,y:Int):Int=x+y
}
sum: (Int, Int) => Int = <function2>
scala> sum(4,6)
res7: Int = 10
//与创建函数类型对象sum的作用一样
scala> val sum=(x:Int,y:Int)=>x+y
sum: (Int, Int) => Int = <function2>
//与创建类型类型对象sum的作用一样
scala> def sum(x:Int,y:Int)=x+y
sum: (x: Int, y: Int)Int
代码
val sum=new Function2[Int,Int,Int] {
defapply(x:Int,y:Int):Int=x+y
}
创建了一个函数类型对象sum,该对象的类型为Function2,它与函数字面量val sum=(x:Int,y:Int)=>x+y及函数def sum(x:Int,y:Int)=x+y是等价的,只不过后面两种函数定义方式更简便和直观。
Scala学习(公众微信号:ScalaLearning)每天为大家带来一点Scala语言、Spark、Kafka、Flink、AKKA等大数据技术干货及相关技术资讯
技术永无止境,勇攀高峰,一往直前!
觉得文章不错?扫描关注