Вернуть карту с размерами файлов, используя лямбда-выражение и регулярное выражение java - PullRequest
0 голосов
/ 19 февраля 2020

Как вернуть карту с размером файлов в указанном каталоге, имена которых соответствуют указанной маске. Маска DOS может содержать специальные символы '*' и '?'.

Мой код:

public Map<Path, Long> fileSizes(Path dir, String mask, boolean recursive) throws IOException {
    return Files.walk(dir)
            .filter(Files::isRegularFile)
            .filter( x -> x.toFile().getName().equals(mask))
            How to make a filter by mask and regular expression correctly? Where to insert "regex"?
            .collect(Collectors.toMap(Path::getFileName, (x) -> x.toFile().length()));
}
}

И если вы знаете, скажите мне правильное регулярное выражение. Я сделал это выражение: "(?: (?: *)? (?: \ W +)) | (?: (?: \?) (?: \ W))"

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

Итак, чтобы объединить отличное предложение VGR и ваш слегка подправленный код, мы получаем что-то вроде этого:

public Map<Path, Long> fileSizes(Path dir, String mask, boolean recursive) throws IOException {
    PathMatcher pathMatcher = dir.getFileSystem().getPathMatcher("glob:" + mask);
    return Files.walk(dir, recursive ? Integer.MAX_VALUE : 1)
            .filter(Files::isRegularFile)
            .filter(path -> pathMatcher.matches(path.getFileName()))
            .collect(Collectors.toMap(
                    Path::getFileName,
                    path -> {
                        try {
                            return Files.size(path);
                        } catch (IOException e) {
                            throw new UncheckedIOException(e);
                        }
                    }
            ));
}

Самая уродливая часть здесь обрабатывает IOException внутри лямбды ...

0 голосов
/ 19 февраля 2020

С этой реализацией могут быть проблемы?

public Map<Path, Long> fileSizes(Path dir, String mask, boolean recursive) throws IOException {
    final PathMatcher pathMatcher = dir.getFileSystem().getPathMatcher("glob:**/*" + mask + "*");

    try (final Stream<Path> stream = Files.walk(dir, recursive ? Integer.MAX_VALUE : 1)) {
        return stream.filter(pathMatcher::matches)
                .collect(Collectors.toMap(Path::getFileName, (x) -> x.toFile().length()));
    }
}
...