把函数当做参数,传递给函数(好绕-..-),称为高阶函数。
高阶函数使我们的代码保持DRY(Dont't Repeat Yourself)
举个例子
一个返回所有扩展名为".scala"的文件的方法:
def filesHere = (new java.io.File(".")).listFiles
def filesEnding(query: String) =
for (file <- filesHere; if file.getName.endsWith(query))
yield file
}
如果我们需要一个方法,返回所有包含特定关键字的文件:
def filesContaining(query: String) =
for (file <- filesHere; if file.getName.contains(query))
yield file
如果我们又需要一个方法,返回所有匹配通配符的文件:
def filesRegex(query: String) =
for (file <- filesHere; if file.getName.matches(query))
yield file
很明显,这里有很多重复的代码。使用高阶函数,我们将对文件名处理的地方用传递进来的函数处理:
def filesMatching(query: String,
matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query))
yield file
}
使用闭包
(包含自由变量,函数文本参数没有该变量,但是函数文本内有该变量,通过捕获得到。称为闭包)和占位符
进一步简化代码:
private def filesMatching(matcher: String => Boolean) =
for (file <- filesHere; if matcher(file.getName))
yield file
def filesEnding(query: String) =
filesMatching(_.endsWith(query))
def filesContaining(query: String) =
filesMatching(_.contains(query))
def filesRegex(query: String) =
filesMatching(_.matches(query))
Reference
Scala编程第9章,控制抽象
时间: 2024-12-28 04:51:04