用一个例子告诉你 scala是怎样Lambda表达式和闭包来减少重复代码(高阶函数的体现)

需求描述:

编写一个工具类,用来搜索固定路径下的文件
给用户提供四个方法
    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)
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值