高阶函数
作为值的函数
Scala中,函数是”头等公民”
import scala.math._
val num = 3.14
val fun = ceil _
对于函数,你能做什么呢?
- 调用它
- 传递它,存放在变量中,或者作为参数传递给另一个函数。
调用示例:
fun(num) //
传递示例:
Array(3.14, 1.43, 2.0).map(fun)
匿名函数
Scala中,你无需给每一个函数命名。
(x: Double) => 3 * x //该函数将传给它的参数乘以3
当然,可以将这个函数存放在变量中:
val triple = (x: Double) => x * 3
//等价于
def triple(x: Double) = 3 * x
但是,这样,更简单些,举例:
Array(3.14, 1.43, 2.0).map((x: Double) => x * 2)
//Array(6.28, 2.85, 4.0)
带函数参数的函数
def valueAtOneQuarter(f: (Double) => Double) = f(0.25)
//此函数接受Double类型并返回Double类型。
高阶函数示例:
def mulBy(factor: Double) = (x: Double) => factor * x
//举例:mulBy(3)返回函数:(x: Double) => 3 * x
val quintuple = mulBy(5)
quintuple(20) //100
参数(类型)推断
valueAtOneQuarter((x: Double) => 3 * x)
//由于上面这个方法知道你会传入一个Double类型的函数,故,简化为:
valueAtOneQuater((x) => x * 3)
//作为额外奖励:对于只有一个参数的函数,你可以略去参数外围的括号:
valueAtOneQuarter(x => x * 3)
//如果参数在=>右侧只出现一次,那么可以用_替换掉它:
valueAtOneQuarter(3 * _)
一些有用的高阶函数
1.map
(1 to 9).map(0.1 * _)
//产生0.1,0.2,0.3...0.9的集合
2.filter方法输出所有匹配某个特定条件的元素。
(1 to 9).filter(_ % 2 == 0) //2, 4, 6, 8
- reduceLeft()方法接受一个二元的函数–即一个带有两个参数的函数–并将它应用到序列中的所有元素,从左到右。
(1 to 9).reduceLeft(_ * _)
//等价于:
1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9
4.sortWith
"Marry has a little lamb".split(" ").sortWith(_.length < _.length)
//Array("a", "had", "Mary", "lamb", "little")
闭包
Scala中,你可以在任何作用域内定义函数:包,类,甚至是另一个函数或方法。
在函数体内,你可以访问到相应作用域内的任何变量。
SAM转换
Scala中,每当你想要告诉另一个函数做某件事时,你都会传给一个函数参数给它。
var counter = 0
val button = new JButton("Increment")
button.addActionListener(new ActionListener{
override def actionPerformed(event: ActionEvent) {
counter += 1
}
})
转换为:
inplicit def makeAction(action: (ActionEvent) => Unit) =
new ActionListener {
override def actionPerformed(event: ActionEvent) {
action(event)
}
}
柯里化
将原来接受两个参数的函数变成新的接受一个参数的函数的过程。
def mul(x: Int, y: Int) = x * y
//柯里化后:
def mulOneAtATime(x: Int) (y: Int) = x * y
控制抽象
我们可以将一系列语句组成不带参数也没有返回值的函数。
def runINThread(block: () => Unit) {
new Thread {
override def run() {block()}
}.start()
}
//等价于:
def runINThread(block: => Unit) {
new Thread {
override def run() {block()}
}.start()
}
return表达式
Scala中你不需要用return语句来返回函数的值。
函数的返回值就是函数体的值。当然,你可以用return来从一个匿名函数中返回值给包含这个匿名函数的带名函数。
def indexOf(str: String, ch: Char): Int = {
var i = 0
until (i == str.length) {
if (str(i) == ch) return i
i += 1
}
return -1
}
本文深入探讨了Scala中的高阶函数概念,包括函数作为值的使用、匿名函数、带函数参数的函数、柯里化及闭包等内容,并通过具体实例展示了如何在实际编程中运用这些高级特性。
1208

被折叠的 条评论
为什么被折叠?



