Как передать карту <Path, List <Path>> в список <String>, содержащий абсолютный путь в виде строки? - PullRequest
3 голосов
/ 26 марта 2019

Мой текущий проект нуждается в методе, который преобразует Map<Path, List<Path>> в List<String>, содержащий абсолютные пути.Map содержит Path файлов, сгруппированных по каталогу, в котором они содержатся.
Однако мне нужно записать все абсолютные пути к файлам, найденным в дамп-файле, поэтому вместо этого мне нужно String sиз Path s.
В настоящее время я делаю это с помощью следующего метода, который использует вложенные forEach вызовы для Map и его значения:

public List<String> getAllAbsolutePaths(Map<Path, List<Path>> filesInPath) {
    List<String> absolutePaths = new ArrayList<String>();

    filesInPath.forEach((directory, files) -> {
        files.forEach(file -> absolutePaths.add(file.toAbsolutePath().toString()));
    });

    return absolutePaths;
}

Это работает, ноЯ просто хочу знать (и даже больше) современный способ сделать это путем потоковой передачи keySet или values из Map.
У меня проблема в том, что я просто не знаю, какпримените file.toAbsolutePath().toString() в потоке.Я просто могу собрать все Path s как List<Path>:

List<Path> filePaths = sqlFilesInDirectories.values().stream()
                            .flatMap(List::stream)
                            .map(Path::toAbsolutePath)
                            .collect(Collectors.toList());

Как я могу изменить это утверждение (или написать совершенно другое), которое дает мне желаемое List<String> срезультат Path.toAbsolutePath().toString()?

1 Ответ

4 голосов
/ 26 марта 2019

Вы почти закончили, вам просто нужно вызвать toString в результирующем списке путей:

List<String> strings = filePaths.stream()
    .map(Object::toString)
    .collect(Collectors.toList());

Или прямо в вашем потоке:

List<String> filePaths = sqlFilesInDirectories.values().stream()
                        .flatMap(List::stream)
                        .map(Path::toAbsolutePath)
                        .map(Object::toString)
                        .collect(Collectors.toList());
...