gpt4 book ai didi

Scala - 如果存在,则删除文件,Scala 方式

转载 作者:行者123 更新时间:2023-12-04 00:08:37 25 4
gpt4 key购买 nike

如何在 Scala 中很好地删除文件,“Scala 方式”?

例如,我可以使用这样的东西,非常 Java 风格:

  private def deleteFile(path: String) = {
val fileTemp = new File(path)
if (fileTemp.exists) {
fileTemp.delete()
}
}

它如何在 Scala 中以更实用的语法实现?

最佳答案

您在做 IO 时无法摆脱副作用- 操作,所以这里没有好的功能方法。当您开始直接与用户/设备交互时,所有功能性的东西实际上都结束了,没有任何 monad 可以帮助您做一个外部副作用;但是,您可以使用 IO 描述(包装)连续的副作用- 像Monads。

谈到你的例子,monad-restyled 代码可能如下所示:

implicit class FileMonads(f: File) {
def check = if (f.exists) Some(f) else None //returns "Maybe" monad
def remove = if (f.delete()) Some(f) else None //returns "Maybe" monad
}

for {
foundFile <- new File(path).check
deletedFile <- foundFile.remove
} yield deletedFile

res11: Option[java.io.File] = None

但是如果你 ,那太冗长了,没有任何真正的优势。只是 想删除一个文件。不仅如此, fileTemp.exists check 没有意义,实际上也不可靠(正如@Eduardo 指出的那样)。所以,即使在 Scala 中,我所知道的最好方法是 FileUtils.deleteQuietly :
  FileUtils.deleteQuietly(new File(path))

甚至
  new File(path).delete()

它不会为不存在的文件抛出异常 - 只需返回 false .

如果你真的想要更多的 Scala 方式 - 看看 rapture.io例如:
  val file = uri"file:///home/work/garbage"
file.delete()

scala-io .
更多信息: How to do File creation and manipulation in functional style?

附言然而,当您需要异步操作时,IO-monads 可能很有用(不像我的 Some/None),所以简单的代码(没有cats/scalaz)看起来像:
implicit class FileMonads(f: File) {
def check = Future{ f.exists } //returns "Future" monad
def remove = Future{ f.remove } //returns "Future" monad
}

for {
exists <- new File(path).check
_ <- if (exists) foundFile.remove else Future.unit
}

当然,在现实世界中,最好使用一些 NIO-wrappers,例如 FS2-io : https://lunatech.com/blog/WCl5OikAAIrvQCoc/functional-io-with-fs2-streams

关于Scala - 如果存在,则删除文件,Scala 方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015165/

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