Метод Scala, который возвращает несколько объединенных функций фильтра - PullRequest
8 голосов
/ 05 августа 2010

В моем приложении я фильтрую массив файлов по различным типам, например следующим:

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"))

Но было бы более аккуратно определить метод, который принимает массив String и возвращает все этифильтры как объединенная функция.Это возможно?Так что я могу написать

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

Ответы [ 2 ]

10 голосов
/ 05 августа 2010

Вы можете сделать что-то вроде этого:

def notEndsWith(suffix: String*): File => Boolean = { file =>
  !suffix.exists(file.getName.endsWith)
}
1 голос
/ 05 августа 2010

Один путь будет примерно таким:

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
...