当我使用旧时尚的list.iterator()在目录上进行递归时,以下代码有效,但我不理解仅当按照Java 8样式使用lambda时才会出现stackoverflow的原因。
private void walk(File file, int depth) {
if (depth >= maxDepth)
return;
List<File> files = file.isDirectory()?Arrays.asList(file.listFiles()):Arrays.asList(file);
filesStream.addAll(files.stream()
.filter(predicate1.and(predicate2))
.collect(Collectors.toList()));
Stream<File> filteredDirectories = files.stream()
.filter(predicate3.and(predicate4));
int currentDepth = ++depth;
filteredDirectories.forEach(f -> walk(f, currentDepth));
}
以下是堆栈跟踪
java.lang.StackOverflowError
at java.util.Collection.stream(Collection.java:581)
at org.util.DirectoryManager.walk(DirectoryManager.java:192)
at org.util.DirectoryManager.lambda$12(DirectoryManager.java:198)
at org.util.DirectoryManager$$Lambda$10/1068824137.accept(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.util.DirectoryManager.walk(DirectoryManager.java:198)
at org.util.DirectoryManager.lambda$12(DirectoryManager.java:198)
at org.util.DirectoryManager$$Lambda$10/1068824137.accept(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.util.DirectoryManager.walk(DirectoryManager.java:198)
at org.util.DirectoryManager.lambda$12(DirectoryManager.java:198)
at org.util.DirectoryManager$$Lambda$10/1068824137.accept(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
...
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:418)
at org.util.DirectoryManager.walk(DirectoryManager.java:198)
at org.util.DirectoryManager.lambda$12(DirectoryManager.java:198)
at org.util.DirectoryManager$$Lambda$10/1068824137.accept(Unknown Source)
at java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:175)
at java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:512)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:502)
at java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
at java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
最佳答案
您无限递归。如果file
不是目录,您仍然可以再次浏览它。首先检查file
是目录,例如,
if (file.isDirectory()) {
Stream<File> filteredDirectories = files.stream()
.filter(predicate1.and(predicate2));
int currentDepth = ++depth;
filteredDirectories.forEach(f -> walk(f, currentDepth));
}