gpt4 book ai didi

android - 这个 Kotlin FileFilter 有什么问题?

转载 作者:行者123 更新时间:2023-12-02 13:01:51 25 4
gpt4 key购买 nike

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

fileArray = fileDirectory.listFiles { file, filename ->
file.length() > 0 && filename.matches(fileMatcherRegex)
}

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

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

我究竟做错了什么?

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

提前致谢

约翰

最佳答案

方法listFiles期望一个带有两个参数的 lambda,它基于 SAM conversionFilenameFilter 上的这个方法界面:

/**
* 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);

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

实际上,将您的原始代码读取为:
val fileArray = fileDirectory.listFiles { directory, filename ->
directory.length() > 0 && filename.matches(fileMatcherRegex)
}

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

如果您对 lambda 使用单个参数,那么您将根据 SAM conversion 指定一个参数。来自 FileFilter接口(interface)是:

/**
* Tests whether or not the specified abstract pathname should be
* included in a pathname list.
*
* @param pathname The abstract pathname to be tested
* @return <code>true</code> if and only if <code>pathname</code>
* should be included
*/
boolean accept(File pathname);

这是正确的,您在其中询问有关文件而不是包含目录的问题。您的代码将是:
val fileArray = fileDirectory.listFiles { file ->
file.length() > 0 && file.name.matches(fileMatcherRegex)
}

关于android - 这个 Kotlin FileFilter 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52564713/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com