एक आगंतुक वास्तव में कार्यों के लाभ के बिना foreach
है, तो चलिए foreach
बनाते हैं। विधि स्थिर है, लेकिन यह पहला तर्क एक Path
के रूप में लेता है, तो हम एक foreach
विधि है, जो कुछ इस तरह से किया जाता है के साथ Path
को बेहतर बनाने के होगी:
import java.nio.file._
import java.nio.file.attribute.BasicFileAttributes
implicit def fromNioPath(path: Path): TraverseFiles = new TraversePath(path)
और बाकी सब TraversePath
वर्ग, अंदर है जो कुछ हद तक इस तरह दिखता है:
class TraversePath(path: Path) {
def foreach(f: (Path, BasicFileAttributes) => Unit) {
// ...
}
}
यह पर्याप्त है तो आप इस लिखने के लिए:
ProjectHome foreach ((file, _) => if (!file.toString.contains(".svn")) println(File))
बेशक, यह वास्तव में कुछ भी करेंगे नहीं, तो चलो यह कुछ करने के लिए मिलता है:
class TraversePath(path: Path) {
def foreach(f: (Path, BasicFileAttributes) => Unit) {
class Visitor extends SimpleFileVisitor[Path] {
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = try {
f(file, attrs)
FileVisitResult.CONTINUE
} catch {
case _ => FileVisitResult.TERMINATE
}
}
Files.walkFileTree(path, new Visitor)
}
}
वहाँ, अब है कि रेखा के रूप में अपने कोड किया एक ही बात करना होगा! हालांकि, हम इसे और बेहतर कर सकते हैं। ऐसा होता है कि foreach
Traversable
की एकमात्र विधि है, इसलिए हम उस वर्ग को बढ़ा सकते हैं, और स्कैला संग्रह के सभी तरीकों को प्राप्त कर सकते हैं!
एकमात्र समस्या यह है कि Traversable.foreach
फ़ंक्शन केवल एक तर्क लेता है, और यहां हम दो ले रहे हैं। हालांकि, हम इसे एक tuple प्राप्त करने में बदल सकते हैं।
import java.nio.file._
import java.nio.file.attribute.BasicFileAttributes
import scala.collection.Traversable
// Make it extend Traversable
class TraversePath(path: Path) extends Traversable[(Path, BasicFileAttributes)] {
// Make foreach receive a function from Tuple2 to Unit
def foreach(f: ((Path, BasicFileAttributes)) => Unit) {
class Visitor extends SimpleFileVisitor[Path] {
override def visitFile(file: Path, attrs: BasicFileAttributes): FileVisitResult = try {
// Pass a tuple to f
f(file -> attrs)
FileVisitResult.CONTINUE
} catch {
case _ => FileVisitResult.TERMINATE
}
}
Files.walkFileTree(path, new Visitor)
}
}
ProjectHome foreach {
// use case to seamlessly deconstruct the tuple
case (file, _) => if (!file.toString.contains(".svn")) println(File)
}
अस्वीकरण:: यहाँ पूरा कोड है मैं, इस कोड में से कोई भी परीक्षण किया है क्योंकि मैं जावा 7 स्थापित नहीं है। शायद कुछ कीड़े हैं।