Coursera Scala 2-1:高阶函数

把函数当做参数,传递给函数(好绕-..-),称为高阶函数。
高阶函数使我们的代码保持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章,控制抽象



你可能感兴趣的:(scala)