Scala方法,返回多个连接过滤器函数

Ing*_*her 8 scala scala-2.8

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

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"))
Run Code Online (Sandbox Code Playgroud)

但是,定义一个采用String数组并将所有这些过滤器作为连接函数返回的方法会更加巧妙.那可能吗?这样我就可以写了

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

Mor*_*itz 10

你可以这样做:

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

  • 很好,虽然我可能会实施"endsWith"而不是"notEndsWith",作为一项规则.如果你实现"notEndsWith"并且实际上需要"endsWith",你最终编码为!notEndsWith,由于双重否定而令人困惑.在函数式编程中,总是正确定义条件更为重要,因为功能构造的额外密度需要额外注意表达的清晰度 (3认同)