Как передать карту<Path, Список> в список, содержащий абсолютный путь в виде строки?

#java #string #dictionary #java-8 #java-stream

#java #строка #словарь #java-8 #java-stream

Вопрос:

Моему текущему проекту нужен метод, который преобразует a 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;
}
  

Это работает, но я просто хочу знать (n еще более) современный способ сделать это путем потоковой передачи 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. Просто добавьте второй вызов map .map(Path::toAbsolutePath).map(Object::toString)

2. @Michael О, я не думал об использовании Object.toString() для этого! Спасибо, что указали на это.

Ответ №1:

Вы почти закончили, вам просто нужно вызвать 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());
  

Комментарии:

1. Спасибо, этот второй код — именно то, что мне нужно. Первый вариант тоже классный, но это означало бы второе утверждение, которого я пытался избежать.