这个Kotlin FileFilter有什么问题?

Joh*_*ohn 0 lambda android kotlin

我的Kotlin Android应用程序中有以下FileFilter:

fileArray = fileDirectory.listFiles { file, filename ->
  file.length() > 0 && filename.matches(fileMatcherRegex)
}
Run Code Online (Sandbox Code Playgroud)

它可以在文件名匹配器上正确过滤,但不会过滤出长度为0的文件。稍后,我遍历fileArray并记录每个文件的长度,我看到长度为0。

奇怪的是,如果我改变了file.length() > 0,比方说,file.length() > 999999999999,它过滤掉所有的文件,所以过滤器的长度()元素正在测试。我所理解的只是没有产生结果。

我究竟做错了什么?

我仍然对Kotlin lambdas有所了解,所以我猜我的错误与此有关。

提前致谢

约翰

Jay*_*ard 6

该方法listFiles需要一个带有两个参数的lambda,该参数基于接口上此方法的SAM转换FilenameFilter

/**
 * Tests if a specified file should be included in a file list.
 *
 * @param   dir    the directory in which the file was found.
 * @param   name   the name of the file.
 * @return  <code>true</code> if and only if the name should be
 * included in the file list; <code>false</code> otherwise.
 */
boolean accept(File dir, String name);
Run Code Online (Sandbox Code Playgroud)

第一个参数是包含文件的DIRECTORY,而不是文件本身。只有第二个参数代表目录中的文件。因此,您file.length()正在检查fileDirectory.length()而不是文件的长度。

实际上,将原始代码读取为:

val fileArray = fileDirectory.listFiles { directory, filename ->
  directory.length() > 0 && filename.matches(fileMatcherRegex)
}
Run Code Online (Sandbox Code Playgroud)

现在您可以看到这是不正确的逻辑。

如果您对lambda使用单个参数,那么您将基于以下接口从SAM转换指定一个参数FileFilter

val fileArray = fileDirectory.listFiles { directory, filename ->
  directory.length() > 0 && filename.matches(fileMatcherRegex)
}
Run Code Online (Sandbox Code Playgroud)

这是正确的,您在这里询问有关文件而不是包含目录的问题。您的代码将是:

val fileArray = fileDirectory.listFiles { file ->
  file.length() > 0 && file.name.matches(fileMatcherRegex) 
}
Run Code Online (Sandbox Code Playgroud)