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中。

 

posted @ 2019-03-14 18:59  Rabbit624  阅读(1764)  评论(0编辑  收藏  举报