首页 > 解决方案 > Scala:如何在复制文件的函数上动态指定条件

问题描述

我有一个功能可以将所有文件移动srctgt. 现在我想添加第三个参数,例如一个函数数组,其中包含src应排除哪些文件的条件。每个函数都应该返回一个布尔值,指示文件是否应该被移动。函数应该类似于:如果文件以“_”开头,则不要移动。

这样的事情如何在scala中实现?

标签: scala

解决方案


我想您可以利用作为第一公民的功能的优势:

def method(src: String, tgt: String, filters: List[File => Boolean])

然后,您可以传递要用作过滤器的任何功能。

method("path/to/folder", "path/to/destination", List(_.getPath.startsWith("_")))

在列表中指定类型,您可以轻松写入值:

List[File => Boolean](
  _.getPath.startsWith("_"),
  _.getName.contains("foobar")
)

该方法应该使用所有函数运行所有函数,并期望它们都是 true。为此,您可以查看“减少”列表

filters.reduce[File => Boolean] { case (a, b) =>
  file => a(file) && b(file)
}(yourFile)

正如@LuisMiguelMejíaSuárez 所说,在这种情况下使用 forall 更有意义:

filters.forall(p => p(file))

这将运行所有条件并期望对所有条件都适用......容易得多:)


推荐阅读