我可以简化这个解决方案吗?

Can I simplify this solution?

我想简化我的代码。

我的代码用于列出目录,检查文件夹是否包含文件:strings.xml,如果特定文件夹包含文件,拆分这些文件夹的名称以获得语言后缀(加载到 table 或列表), 例子 : 我的目录树包含一些文件夹
--值
--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 次。

我不确定您提供的代码是否解决了您描述的问题。但假设确实如此 - 有几个建议:

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