我正在编写一个运行课程的测试'针对目录中每个zip文件的main方法(它将文件名作为参数)。我有以下内容:
private ArrayList<Path> getZipFiles() throws IOException {
ArrayList<Path> result = new ArrayList<>();
Path thisDir = Paths.get("src/test/resources");
try (DirectoryStream<Path> s = Files.newDirectoryStream(thisDir, "*.zip")){
s.forEach(filePath -> {
result.add(filePath);
});
}
return result;
}
@Test
public void test() {
try {
ArrayList<Path> p = getZipFiles();
p.stream().toString().forEach(ValidatorMain::main);
} catch (IOException e) {
fail()
}
}
问题是stream().toString()
没有返回String[]
。如何以Java-8格式转换/创建String []?
答案 0 :(得分:2)
在这种情况下,您可以使用map
方法,例如:
p.stream().map(path -> path.toString()).forEach(ValidatorMain::main);
答案 1 :(得分:1)
如果您想使用Stream API,则应重新考虑您的设计。您无需将文件收集到ArrayList
然后:
private Stream<Path> getZipFiles() throws IOException {
Path thisDir = Paths.get("src/test/resources");
return Files.list(thisDir).filter(p -> p.getFileName().toString().endsWith(".zip"));
}
@Test
public void test() throws IOException {
try(Stream<Path> s=getZipFiles()) {
s.map(Object::toString).forEach(ValidatorMain::main);
}
}
请注意,在测试用例中捕获异常是一个非常糟糕的主意,因此在由于I / O故障而验证实际上甚至没有运行的情况下假装成功。让测试方法抛出异常更加清晰。
顺便说一句,您不需要始终使用方法引用也不需要将所有内容分解为单个方法。因此,如果您继续使用getZipFiles()
返回List<Path>
的原始方法,则还可以使用不带Stream API的lambda表达式:
private List<Path> getZipFiles() throws IOException {
Path thisDir = Paths.get("src/test/resources");
return Files.list(thisDir)
.filter(p -> p.getFileName().toString().endsWith(".zip"))
.collect(Collectors.toList());
// Alternative:
// ArrayList<Path> result = new ArrayList<>();
// try(DirectoryStream<Path> s = Files.newDirectoryStream(thisDir, "*.zip")) {
// s.forEach(result::add);
// }
// return result;
}
@Test
public void test() throws IOException {
getZipFiles().forEach(p -> ValidatorMain.main(p.toString()));
}
答案 2 :(得分:0)
p.stream().toString()
是Object::toString
电话。它不是stream
中的数据处理。
要进行正确的检查,您需要:
p.stream().map(Path::toString).allMatch(ValidatorMain::main);
即。检查所有路径是否有效。