如何在Scala中使用java.nio.file.Files.walkFileTree
发布时间:2020-12-16 18:42:12 所属栏目:安全 来源:网络整理
导读:我想在 Scala中使用新的java.nio.file.Files.walkFileTree.我甚至成功了: class Visitor extends java.nio.file.SimpleFileVisitor [java.nio.file.Path] { override def visitFile( File : java.nio.file.Path,Attrs : java.nio.file.attribute.BasicFileA
我想在
Scala中使用新的java.nio.file.Files.walkFileTree.我甚至成功了:
class Visitor extends java.nio.file.SimpleFileVisitor [java.nio.file.Path] { override def visitFile( File : java.nio.file.Path,Attrs : java.nio.file.attribute.BasicFileAttributes) : java.nio.file.FileVisitResult = { if (! File.toString.contains(".svn")) { System.out.println(File); } // if java.nio.file.FileVisitResult.CONTINUE; } // visitFile } // Visitor java.nio.file.Files.walkFileTree (Project_Home,new Visitor) 但是,虽然这段代码工作得很好,但我觉得有点像将Java范例带入Scala.对真正的斯卡拉大师来说,这是一个问题:我有什么可以改进的,或者就是这样吗? 解决方法
一个访客真的是一个没有功能的好处,所以让我们做一个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所需的唯一方法,所以我们可以扩展该类,并获得Scala集合的所有方法! 唯一的问题是Traversable.foreach函数只接受一个参数,而这里我们需要两个参数.但是,我们可以将其更改为接收元组.这是完整的代码: 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) } 免责声明:我没有测试过这段代码,因为我没有安装Java 7.可能存在一些错误. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |