Что не так с этим Kotlin FileFilter? - PullRequest
       0

Что не так с этим Kotlin FileFilter?

0 голосов
/ 29 сентября 2018

В моем приложении 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, поэтому я предполагаю, что моя ошибка связана с этим.

спасибо заранее

Джон

1 Ответ

0 голосов
/ 29 сентября 2018

Метод listFiles ожидает лямбду с двумя параметрами, основанную на преобразовании 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);

Первый параметр:КАТАЛОГ, содержащий файл, а не сам файл.Только второй параметр представляет файл в каталоге.Таким образом, ваш file.length() проверяет fileDirectory.length() вместо длины файла.

По сути, читайте ваш исходный код как:

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

И теперь вы можете видеть, что это неверная логика.

Если вы используете один и тот же параметр для своей лямбды, тогда вы указываете его на основе SAM преобразования из интерфейса FileFilter, который:

/**
 * 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) 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...