Могу ли я упростить это решение?

Я хочу упростить мой код.

Мой код предназначен для перечисления каталогов, проверьте, содержат ли папки файлы: 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());
}
Другие вопросы по тегам