2010-08-04 10 views
8

En mi aplicación, estoy filtrando un conjunto de archivos de varios tipos, como la siguiente:método Scala que devuelve múltiples funciones de filtro concatenados

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

Pero sería más cuidadosamente para definir un método que toma una String array y devuelve todos esos filtros como una función concatenada. ¿Es eso posible? Así que puedo escribir

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

Respuesta

10

se podría hacer algo como esto:

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

+1 es la razón por la que amo Scala – onof

+3

Bueno, aunque probablemente implementaría "endsWith" en lugar de "notEndsWith", como regla. Si implementa "notEndsWith" y realmente necesita "endsWith", termina codificando como! NotEndsWith, lo cual es confuso debido al doble negativo. Siempre es más importante definir las condiciones de forma positiva con la programación funcional, ya que la densidad adicional de los constructos funcionales exige atención adicional a la claridad de expresión –

1

Una forma sería algo como esto:

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

que podría llamarse así:

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