我使用以下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
子句的内容?
答案 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
}
这只会对文件进行一次迭代,并且不需要形成中间集合。