【问题标题】:Scala method that returns multiple concatenated filter functions返回多个连接过滤器函数的 Scala 方法
【发布时间】:2010-08-04 22:04:51
【问题描述】:

在我的应用程序中,我正在按各种类型过滤文件数组,如下所示:

val files:Array[File] = recursiveListFiles(file)
  .filter(!_.toString.endsWith("png"))
  .filter(!_.toString.endsWith("gif"))
  .filter(!_.toString.endsWith("jpg"))
  .filter(!_.toString.endsWith("jpeg"))
  .filter(!_.toString.endsWith("bmp"))
  .filter(!_.toString.endsWith("db"))

但是定义一个方法会更简洁,它接受一个字符串数组并将所有这些过滤器作为一个连接函数返回。那可能吗? 这样我就可以写了

val files:Array[File] = recursiveListFiles(file).filter(
  notEndsWith("png", "gif", "jpg", "jpeg", "bmp", "db") 
)

【问题讨论】:

    标签: scala scala-2.8


    【解决方案1】:

    你可以这样做:

    def notEndsWith(suffix: String*): File => Boolean = { file =>
      !suffix.exists(file.getName.endsWith)
    }
    

    【讨论】:

    • 很好,虽然我可能会按照规则实现“endsWith”而不是“notEndsWith”。如果你实现了“notEndsWith”并且实际上需要“endsWith”,你最终会编码为 !notEndsWith,由于双重否定,这是令人困惑的。对于函数式编程而言,始终积极地定义条件更为重要,因为函数式构造的额外密度需要额外注意表达的清晰度
    【解决方案2】:

    一种方法是这样的:

    def notEndsWith(files:Array[File], exts:String*) = 
      for(file <- files; if !exts.exists(file.toString.endsWith(_))) yield file
    

    可以这样称呼:

    val files = Array(new File("a.png"),new File("a.txt"),new File("a.jpg"))
    val filtered = notEndsWith(files, "png", "jpg").toList
    

    【讨论】:

      猜你喜欢
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2018-09-16
      • 2018-07-16
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 2018-04-30
      相关资源
      最近更新 更多