流式传输到main方法的路径

时间:2016-09-12 14:53:55

标签: java java-8

我正在编写一个运行课程的测试'针对目录中每个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 []?

3 个答案:

答案 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);

即。检查所有路径是否有效。