Могу ли я упростить это решение? - PullRequest
0 голосов
/ 22 февраля 2019

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

мой код предназначен для перечисления каталогов, проверьте, содержат ли папки файлы: strings.xml и, если конкретная папка содержит файл, разделите имена этих папок, чтобы получить суффикс языка (загрузитьэто таблица или список), пример: мое дерево каталогов содержит несколько папок
--value
--value-en
--value-de
--value-pl
--другие папки

мой код: языки - это [] в следующем примере

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 Ответ

0 голосов
/ 22 февраля 2019

Я не уверен, что указанный вами код решает описанную вами проблему.Но при условии, что это так - есть пара предложений:

  • 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());
}
...