代码之家  ›  专栏  ›  技术社区  ›  Wolkenarchitekt

Scala方法,返回多个串联的过滤器函数

  •  8
  • Wolkenarchitekt  · 技术社区  · 14 年前

    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") 
    )
    
    2 回复  |  直到 14 年前
        1
  •  10
  •   Moritz    14 年前

    你可以这样做:

    def notEndsWith(suffix: String*): File => Boolean = { file =>
      !suffix.exists(file.getName.endsWith)
    }
    
        2
  •  1
  •   Fabian Steeg    14 年前

    一种方法是这样的:

    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