Объедините три карты с одинаковыми ключами - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь получить все имена файлов, размер файла и время последнего изменения. Я использую поток для их сбора. См. Коды ниже. Однако, как я думаю, нужны три карты. {File: fileName} {File: fileSize} {File: fileLastMod}. Есть ли способ, которым я могу использовать Stream для сбора в одну карту, например {"name": fileName, "size": fileSize, "time": lastMod} PS: Я думаю, что могу использовать класс для решения этой проблемы. Я думаю, смогу ли я сделать это в потоке.

RegexFileFilter fileFilter;
    // if extension is "*" then shows all the file
    if (exe.equals("*")) {
         fileFilter = new RegexFileFilter(".*\\..*");
    }else{
        fileFilter = new RegexFileFilter("\\." + exe);
    }

    ObservableMap<File, String> fileNameMap = FXCollections.observableMap(
            FileUtils.listFiles(targetDir, fileFilter, FileFileFilter.FILE)
                    .stream()
                    .collect(Collectors.toMap(identity(), File::getName)));

    Map<File, Long> fileSize = FileUtils
            .listFiles(targetDir, fileFilter, FileFileFilter.FILE)
            .stream()
            .collect(Collectors.toMap(identity(), FileUtils::sizeOf));

    Map<File, Long> fileLastModifyTime = FileUtils
            .listFiles(targetDir, fileFilter, FileFileFilter.FILE)
            .stream()
            .collect(Collectors.toMap(identity(), File::lastModified));

Ответы [ 2 ]

4 голосов
/ 19 июня 2020

Почему так сложно? Вся необходимая информация содержится в самом классе File.

Простой List<File> уже удовлетворит ваши потребности. Фактически вы просто сохраняете избыточную информацию на этих картах, которая не служит дополнительной цели.

3 голосов
/ 19 июня 2020

Вам просто нужно создать свой собственный класс:

class FileInfo {
    private String name;
    private long size;
    private long lastModified;

    // constructors, getters, setters, hashcode, equals etc. omitted for brevity
}

А затем изменить свои 3 Stream на этот единственный Stream:

Map<File, FileInfo> map = FileUtils
    .listFiles(targetDir, fileFilter, FileFileFilter.FILE)
    .stream()
    .collect(Collectors.toMap(
        identity(), 
        file -> new FileInfo(file.getName(), FileUtils.sizeOf(file), file.lastModified())
    ));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...