加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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.可能存在一些错误.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读