暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

每日一课:函数类型

Scala学习 2016-02-26
145

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等大数据技术干货及相关技术资讯

技术永无止境,勇攀高峰,一往直前!



觉得文章不错?扫描关注



文章转载自Scala学习,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论