#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. Спасибо, этот второй код — именно то, что мне нужно. Первый вариант тоже классный, но это означало бы второе утверждение, которого я пытался избежать.