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有所了解,所以我猜我的错误与此有关。
提前致谢
约翰
该方法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)
| 归档时间: |
|
| 查看次数: |
811 次 |
| 最近记录: |