31.scala编程思想笔记——作为对象的函数

31.scala编程思想笔记——作为对象的函数

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/50445775
源码下载连接请见第一篇笔记。

我们可以将方法以对象的形式作为参数传递给其他方法。需要使用函数对象来打包方法,函数对象常简称为函数。

         例如,foreach对于像Vector这样的序列来说是一个非常有用的方法。

         接受参数(即一个函数),并将其应用到序列中的每个元素上。

例如:

def show(n:Int):Unit = { println("> "+n) }

val v = Vector(1, 2, 3, 4)

v.foreach(show)

执行如下:

> 1

> 2

> 3

> 4

方法是依附于类或对象的,而函数是其自身的对象。

         将show当作一个函数进行传递时,scala会自动将其转换为函数对象,这称为提升。

         当作参数传递给其他方法或函数的函数通常都非常小,而且非常只使用一次。对于强制创建具名方法然后将其当作参数传递这种做法,看起来会给程序员带来额外的工作量。通常可以定义一个匿名函数。

         将show转换为匿名函数并直接将其传递给foreach,ruxia

        (n:Int) => {println(“>” + n)}

         可以继续简化,移除大括号。

如下:

val v = Vector(1, 2, 3, 4)

v.foreach(n => println("> " + n))

输出如下:

> 1

> 2

> 3

> 4

也可以应用于其他类型的序列如下:

val duck = "Duck".toVector

duck.foreach(n => println("> " + n))

也可以将结果保存到字符串中,如下:

import com.atomicscala.AtomicTest._

 

var s = ""

val duck = "Duck".toVector

duck.foreach(n => s = s + n + ":")

s is "D:u:c:k:"

此外,具有0个参数也可以是匿名的。例如:

class Later(val f: () => Unit) {

  defcall():Unit = { f() }

}

 

val cl = new Later(() => println("now"))

cl.call()

定义了一个类,接受一个具有0个参数的函数作为参数,然后在后续调用该函数。

无任何参数、=>、和unit合起来表示不返回任何信息。

甚至可以将匿名函数赋给一个var或val:

val later1 = () => println("now")

var later2 = () => println("now")

 

later1()

later2()

输出如下:

now

now

可以在任何使用常规函数的地方使用匿名函数,如果该匿名函数变得过于复杂,最好定义一个具名函数。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值