我可以简化这个解决方案吗?
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());
}
我想简化我的代码。
我的代码用于列出目录,检查文件夹是否包含文件: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());
}