Могу ли я упростить это решение?
Я хочу упростить мой код.
Мой код предназначен для перечисления каталогов, проверьте, содержат ли папки файлы: strings.xml и, если конкретная папка содержит файл, разделите имена этих папок, чтобы получить суффикс языка (загрузите его в таблицу или список), пример: мое дерево каталогов содержит несколько папок
--значение
--value-ен
--value-де
--value-пл
- другие папки
мой код:
languages - это [] в приведенном ниже примере
Path dir_path = Paths.get("D:/Work/Projekty/Java/Tools/Mobilne zasoby/arcadia-drafter/res/");
DirectoryStream<Path> stream = Files.newDirectoryStream(dir_path);
for (Path file_path : stream)
{
DirectoryStream<Path> stream1 = Files.newDirectoryStream(file_path, "strings.xml");
for (Path xml_name : stream1)
{
if (file_path.getFileName().toString().startsWith("values-"))
{
languages = file_path.getFileName().toString().split("-");
}
}
}
Можете ли вы помочь мне упростить этот код? Интересно, если я должен 2 раза использовать поток каталогов.
1 ответ
Решение
Я не уверен, что ваш код решает описанную вами проблему. Но при условии, что это так - есть пара предложений:
DirectoryStream
должен быть закрыт. Если вы не используетеtry-with-resources
Заявление, не забудьте закрыть поток вfinally
блок.- Кроме того, чтобы сделать код читабельным, я бы предложил разделить этот метод на несколько более простых методов, каждый из которых несет единоличную ответственность.
Итак, вот один из возможных способов сделать код более понятным:
public List<String> getLanguages(String directoryPath) throws IOException {
List<String> languages = new ArrayList<>();
try (DirectoryStream<Path> paths = Files.newDirectoryStream(Paths.get(directoryPath))) {
for (Path filePath : paths) {
try (DirectoryStream<Path> filePaths = Files.newDirectoryStream(filePath, "strings.xml")) {
languages.addAll(getValues(filePaths));
}
}
}
return languages;
}
private List<String> getValues(DirectoryStream<Path> paths) {
return StreamSupport.stream(paths.spliterator(), false)
.map(path -> path.getFileName().toString())
.filter(fileName -> fileName.startsWith("values-"))
.flatMap(fileName -> Arrays.stream(fileName.split("-")))
.collect(Collectors.toList());
}