scala中的匿名函数 ==> 简单示例
//定义一个接收消息的函数 getMsg,它有一个参数 msg 用来接收消息的内容。它的函数体是一个匿名函数,匿名函数有一个参数 name 用来接收姓名。
scala> def getMsg (msg : String) = (name : String) => println(msg + " , " + name)
getMsg: (msg: String)String => Unit
//调用函数getMsg,说 hello
scala> val msg = getMsg("hello")
msg: String => Unit = <function1>
现在得到了一个返回值,它是一个匿名函数。
//调用这个匿名函数,跟 Mike 说 hello
scala> msg("Mike")
hello , Mike
//一步到位的跟 Luffy 说 hi
scala> getMsg("hi")("Luffy")
hi , Luffy
这个例子中的函数getMsg实现了一个简单的发送消息的功能。但是我们可以发送不同的消息内容,而且可以向不同的人发送。这就极大的扩展了函数的功能。getMsg实际上就是scala中的高阶函数,它返回一个匿名函数。
将函数的定义 getMsg: (msg: String)String => Unit 分解开来:
函数名称 :getMsg,
参数列表 :变量msg 类型为String
返回值 : String => Unit 表示一个接收String类型参数,没有返回值的匿名函数
==============================================华丽分割线==============================================================
换一种形式来实现这个功能。
//定义一个打招呼的函数 sayHello,传入一个name,表示跟谁打招呼。
scala> def sayHello (name :String) = println("hello," + name)
sayHello: (name: String)Unit
//定义一个函数 greeting,它也是一个高阶函数,但它与getMsg的定义不同。它接收两个参数:一个是匿名函数,要求这个匿名函数是一个接收String类型参数,没有返回值的函数。另外一个参数是String类型的变量。
scala> def greeting(func :(String => Unit),name :String) = {func(name)}
greeting: (func: String => Unit, name: String)Unit
//调用函数 ,跟 Mike 打个招呼吧。
scala> greeting(sayHello,"Mike")
hello,Mike
看似现在功能不如gegMsg强大吖。只能说hello,不能说别的了?
其实并不是。这个函数的功能可能更大强大,因为它可以接收任意的一个符合它参数定义的匿名函数作为参数。比如,我们可以定义一个说hi的函数
//定义另外一个打招呼的函数
scala> def sayHi(name :String) = println("hi," + name)
sayHi: (name: String)Unit
//调用这个函数跟 Mike 说 hi 吧
scala> greeting(sayHi,"Mike")
hi,Mike
也就是说,只要一个函数符合 String => Unit 这个定义,它就可以作为参数传入到greeting中。