需求描述:
编写一个工具类,用来搜索固定路径下的文件 给用户提供四个方法 1.filesEnding("xxx") 查找以xxx结尾的文件 2.filesStarting("xxx") 查找以xxx开头的文件 3.filesContaining("xxx") 查找包含xxx的文件 4.filesRegex("xxx") 查找符号正则表达式的文件的文件
版本1:
object FileMatcherV1 {
// 定义私有方法(助手方法) 来获取当前目录的所有文件
private def filesHere = (new java.io.File("src/main/scala/com/maven/java")).listFiles
// 定义公共方法 基于文件名结尾搜索
def filesEnding(query: String) = {
for (file <- filesHere; if file.getName.endsWith(query)) yield file.getName
}
// 定义公共方法 基于文件名开头搜索
def filesStarting(query: String) = {
for (file <- filesHere; if file.getName.startsWith(query)) yield file.getName
}
// 定义公共方法 基于文件名内容搜索
def filesContaining(query: String) = {
for (file <- filesHere; if file.getName.contains(query)) yield file.getName
}
// 定义公共方法 基于正则表达式搜索
def filesRegex(query: String) = {
for (file <- filesHere; if file.getName.matches(query)) yield file.getName
}
// 方法测试
def main(args: Array[String]): Unit = {
FileMatcherV1.filesEnding(".java").foreach(println)
FileMatcherV1.filesStarting("O").foreach(println)
FileMatcherV1.filesContaining("One").foreach(println)
FileMatcherV1.filesRegex(".*C*.scala").foreach(println)
}
}
版本2-使用Lambda表达式:
将相同逻辑抽离出来,作为公共方法
object FileMatcherV2 {
// 定义私有方法(助手方法) 来获取当前目录的所有文件
private def filesHere = (new java.io.File("src/main/scala/com/maven/java")).listFiles
/*
* 定义公共方法 将 if表达式抽象出方法,并作为参数传递
* 定义了一个 函数类型的参数 (String, String) => Boolean
* 参数1: 文件名称
* 参数2: 文件规则(前缀、后缀、包含内容、正则表达式)
* 功能: 用来判断 是否符合用户指定的逻辑
*
* */
def filesMatching(query: String, matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query)) yield file.getName
}
def filesStarting(query: String) =
filesMatching(query, _.startsWith(_))
def filesEnding(query: String) =
filesMatching(query, _.endsWith(_))
def filesRegex(query: String) =
filesMatching(query, _.matches(_))
def filesContaining(query: String) =
filesMatching(query,_.contains(_))
// 方法测试
def main(args: Array[String]): Unit = {
FileMatcherV2.filesEnding(".java").foreach(println)
FileMatcherV2.filesStarting("O").foreach(println)
FileMatcherV2.filesContaining("One").foreach(println)
FileMatcherV2.filesRegex(".*C*.scala").foreach(println)
}
}
版本3-使用Lambda表达式+闭包:
object FileMatcherV3 {
// 定义私有方法(助手方法) 来获取当前目录的所有文件
private def filesHere = (new java.io.File("src/main/scala/com/maven/java")).listFiles
/*
* 定义公共方法 将 if表达式抽象出方法,并作为参数传递
* 定义了一个 函数类型的参数 (String, String) => Boolean
* 参数1: 文件名称
* 参数2: 文件规则(前缀、后缀、包含内容、正则表达式)
*
* */
def filesMatching(matcher: (String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName)) yield file.getName
}
def filesStarting(query: String) =
filesMatching(_.startsWith(query))
def filesEnding(query: String) =
filesMatching(_.endsWith(query))
def filesRegex(query: String) =
filesMatching(_.matches(query))
def filesContaining(query: String) =
filesMatching(_.contains(query))
// 方法测试
def main(args: Array[String]): Unit = {
FileMatcherV3.filesEnding(".java").foreach(println)
FileMatcherV3.filesStarting("O").foreach(println)
FileMatcherV3.filesContaining("One").foreach(println)
FileMatcherV3.filesRegex(".*C*.scala").foreach(println)
}
}