В моем приложении я m фильтрование массива файлов по различным типам, например, следующим:
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")
)
Вы можете сделать что-то вроде этого:
def notEndsWith(suffix: String*): File => Boolean = { file =>
!suffix.exists(file.getName.endsWith)
}
Один из способов может быть примерно таким:
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