lambda表达式中的Else子句

时间:2018-03-25 17:02:45

标签: java lambda

我使用以下lambda表达式迭代PDF文件。

public static void run(String arg) {

        Path rootDir = Paths.get(arg);
        PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:**.pdf");
        Files.walk(rootDir)
                .filter(matcher::matches)
                .forEach(Start::modify);
    }

    private static void modify(Path p) {
        System.out.println(p.toString());
    }

这部分.forEach(Start::modify);从lambda表达式所在的同一个类执行静态方法修改。当没有找到PDF文件时,是否有可能添加类似else子句的内容?

3 个答案:

答案 0 :(得分:6)

或者你可以做一件显而易见的事情,即首先收集流。

List<File> files = Files.walk(rootDir)
            .filter(matcher::matches)
            .collect(toList());

if (files.isEmpty())
    doSomethingForEmpty();
else
    files.forEach(Start::modify);

答案 1 :(得分:2)

您可以在filter操作之后将结果收集到列表实例中,然后在操作之前检查大小。

List<Path> resultSet = Files.walk(rootDir)
                            .filter(matcher::matches)
                            .collect(Collectors.toList());
if(resultSet.size() > 0){
    resultSet.forEach(Start::modify);
}else {
    // do something else   
}

或者,您可以这样做:

if(Files.walk(rootDir).anyMatch(matcher::matches)) {
         Files.walk(rootDir)
              .filter(matcher::matches)
              .forEach(Start::modify);
}else {
        // do something else    
}

答案 2 :(得分:1)

如果API为您提供了Stream,但Stream并不是您所需要的,您可以随时将其转换为Iterable并使用简单的for循环:< / p>

boolean fileModified = false;
for (Path path : (Iterable<Path>) Files.walk(rootDir)::iterator) {
    if (matcher.matches(path)) {
        Start.modify(path);
        fileModified = true;
    }
} 
if (!fileModified) {
     // do something
}

这只会对文件进行一次迭代,并且不需要形成中间集合。