Scala第一类函数

函数文本被编译进一个类,类在运行期实例化的时候是一个函数值:function value任何函数值都是某个扩展了若干scala包的FunctionN特质之一的类的实例,如Function0是没有参数的函数,Function1是有一个参数的函数等等。每个FunctionN特质有一个apply方法用来调用函数。因此函数文本和值的区别在于函数文本存在于源代码,而函数值存在于运行期对象。这个区别很像类(源代码)和对象(运行期)的那样。

以下是对数执行递增操作的函数文本的简单例子:

 
 
  1. (x: Int) => x + 1 
=>指明这个函数把左边的东西(任何整数x)转变成右边的东西(x + 1)。所以,这是一个把任何整数x映射为x + 1的函数。

函数值是对象,所以如果你愿意可以把它们存入变量。它们也是函数,所以你可以使用通常的括号函数调用写法调用它们。以下是这两种动作的例子:

 
 
  1. scala> var increase = (x: Int) => x + 1 
  2. increase: (Int) => Int = < function>  
  3. scala> increase(10)  
  4. res0: Int = 11 
本例中,因为increase是var,你可以在之后重新赋给它不同的函数值。

 
 
  1. scala> increase = (x: Int) => x + 9999 
  2. increase: (Int) => Int = < function>  
  3. scala> increase(10)  
  4. res2: Int = 10009 
如果你想在函数文本中包括超过一个语句,用大括号包住函数体,一行放一个语句,就组成了一个代码块。与方法一样,当函数值被调用时,所有的语句将被执行,而函数的返回值就是最后一行产生的那个表达式。

 
 
  1. scala> increase = (x: Int) => {  
  2.         println("We")  
  3.         println("are")  
  4.         println("here!")  
  5.         x + 1 
  6.        }  
  7. increase: (Int) => Int = < function>  
  8. scala> increase(10)  
  9. We  
  10. are  
  11. here!  
  12. res4: Int = 11 
于是现在你已经看到了有如螺丝和螺帽的函数文本和函数值。许多Scala库给你使用它们的机会。例如,所有的集合类都能用到foreach方法。 foreach方法被定义在特质Iterable中,它是List,Set,Array,还有Map的共有超特质。 它带一个函数做参数,并对每个元素调用该函数。下面是如何用它打印输出所有列表元素的代码:

 
 
  1. scala> val someNumbers = List(-11, -10, -50510)  
  2. someNumbers: List[Int] = List(-11, -10, -50510)  
  3. scala> someNumbers.foreach((x: Int) => println(x))  
  4. -11 
  5. -10 
  6. -5 
  7. 0 
  8. 5 
  9. 10 
另一个例子是,集合类型还有filter方法。这个方法选择集合类型里可以通过用户提供的测试的元素。测试是通过函数的使用来提供的。例如,函数(x: Int) => x > 0可以被用作过滤。这个函数映射正整数为真,其它为假。下面说明如何把它用作filter:

 
 
  1. scala> someNumbers.filter((x: Int) => x > 0)  
  2. res6: List[Int] = List(510)  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值