gpt4 book ai didi

scala - 如何在 Scala 中使用 java.nio.file.Files.walkFileTree

转载 作者:行者123 更新时间:2023-12-04 17:03:16 25 4
gpt4 key购买 nike

我想用新的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。所以对真正的 Scala Gurus 提出一个问题:有什么我可以改进的吗,或者仅此而已?

最佳答案

访客实际上是 foreach没有函数的好处,所以让我们做一个 foreach .该方法是静态的,但它的第一个参数是 Path ,所以我们将丰富 ​​Pathforeach方法,这是通过这样的事情完成的:

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)
}
}

在那里,现在该行将执行与您的代码相同的操作!但是,我们可以进一步改进它。碰巧 foreachTraversable 所需的唯一方法,因此我们可以扩展该类,并获取 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。可能有一些错误。

关于scala - 如何在 Scala 中使用 java.nio.file.Files.walkFileTree,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8923336/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com