2016-04-01 14 views
0

古いファッションlist.iterator()を使ってディレクトリを再帰的に処理すると、以下のコードが動作しますが、私がstackoverflowの原因を理解できません。 Java 8スタイルのラムダを使用してください。以下はjava.lang.StackOverflowError問題とLambaと再帰

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) 
+1

、何かのように、最初のディレクトリであることを確認してください。(predicate1.and(predicate2))をフィルタリング'二回 –

+1

MAXDEPTH 'の値が何でありますか'、そしてなぜあなたは' Arrays.asList(file) 'を単一ファイルに使うのですか?これは明らかに同じパラメータで繰り返し呼び出される再帰を引き起こします – njzk2

+0

"代替として"何に?あなたは何をしようとしているのですか*?あなたは基本的に[XY質問](http://meta.stackexchange.com/a/66378)をここに求めているからです。 –

答えて

1

です。 fileがディレクトリではない場合でも、それを再度実行します。 fileは)あなたが `files.streamを(なぜ私は混乱している

if (file.isDirectory()) { 
    Stream<File> filteredDirectories = files.stream() 
      .filter(predicate1.and(predicate2)); 
    int currentDepth = ++depth; 
    filteredDirectories.forEach(f -> walk(f, currentDepth)); 
} 
+0

"再帰"がハイフネーションされたことはありません。 – shmosel

+1

あなたが誰かを誓っていない限り – JamesENL

関連する問題