Mi proyecto actual está en la necesidad de un método que convierte una Map<Path, List<Path>>
a una List<String>
que contiene las rutas absolutas. El Map
contiene Path
s de archivos agrupados por el directorio que los contiene.
Sin embargo, tengo que escribir todas las rutas absolutas de los archivos encontrados en un archivo de volcado, es por eso que necesito String
s en lugar de Path
s.
Por el momento, lo hago con el siguiente método que utiliza anidados forEach
pide a la Map
y sus valores:
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;
}
Esto funciona, pero yo sólo quiero saber una forma (n incluso más) moderna hacerlo enviando la keySet
o el values
de la Map
.
El problema que tengo es que yo no sé cómo aplicar la file.toAbsolutePath().toString()
en la corriente. Sólo soy capaz de cobrar todos los Path
s como List<Path>
:
List<Path> filePaths = sqlFilesInDirectories.values().stream()
.flatMap(List::stream)
.map(Path::toAbsolutePath)
.collect(Collectors.toList());
¿Cómo puedo modificar esta declaración (o escribir uno totalmente diferente) que me da la deseada List<String>
, con el resultado de Path.toAbsolutePath().toString()
?
Ya casi ha terminado, sólo tiene que llamar toString
en la lista de caminos resultante:
List<String> strings = filePaths.stream()
.map(Object::toString)
.collect(Collectors.toList());
O directamente en el torrente:
List<String> filePaths = sqlFilesInDirectories.values().stream()
.flatMap(List::stream)
.map(Path::toAbsolutePath)
.map(Object::toString)
.collect(Collectors.toList());