2017-01-05 2 views
0

Ich habe ein einfaches Abstraktion Dateisystem:Wie kann ich mit Stream einen Baum in Scala durchqueren?

trait PathItem { val label: String } 

case class PathEnd(label: String, uri: String) extends PathItem 

case class PathDirectory(
    label: String = "", 
    contents: List[PathItem] = List.empty[PathItem] 
) extends PathItem 

diese Struktur mit mir einen beliebig komplexen Baum Verzeichnisse aufbauen kann (PathDirectory) und Dateien (PATHEND).

Wie konnte ich Scala Streams eine Liste der „Dateien“, so etwas zu extrahieren: wie diese

getFileStream(rootDir).foreach(f => println(f.uri)) 
getFileStream(rootDir).find(_.uri == "someTargetURI") 

// where getFileStream creates a Stream[PathEnd] given a starting rootDir 

Wenn Sie durch den Baum wäre irgendwie cool, aber ich bin nicht zu verstehen, wie zu schaffen ein Stream dafür aus dem scaladoc.

(ich weiß, ich kann nur eine einfache rekursive Funktion schreiben, aber ich versuche, Bäche hier grok.)

+0

Sie können so ziemlich behandeln ein 'Stream' (oder' Iterator') das gleiche wie Sie wäre ein 'list' und nachfolgende Elemente träge berechnet werden. EDIT: eine gute Grundierung: http://alvinalexander.com/scala/how-to-use-stream-class-lazy-list-scala-cookbook – spiffman

Antwort

1

Wie in den Kommentaren erwähnt, können Sie im Wesentlichen eine Stream gleich behandeln wie einen List und Sie erhalten die gewünschte, langsam bewertete Sequenz. Ihre Lösung:

def fileStream(p: PathItem): Stream[PathEnd] = { 
    p match { 
     case pe: PathEnd => Stream(pe) 
     case pd: PathDirectory => pd.contents.toStream.flatMap(fileStream) 
    } 
} 

Notiere die flatMap zu vermeiden, ein Stream von Stream Instanzen zu schaffen.

Test:

scala> val pd = PathDirectory(root,List(
    PathDirectory("src",List(PathDirectory("main",List(PathEnd("file.scala","file.uri"))))), 
    PathDirectory("test",List(PathDirectory("main",List(PathEnd("test.scala","test.uri"))))))) 
scala> fileStream(pd).foreach(println) 

PathEnd(file.scala,file.uri) 
PathEnd(test.scala,test.uri) 
Verwandte Themen