Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何从pdf文件列表中获取总页数_Scala_Dictionary - Fatal编程技术网

Scala 如何从pdf文件列表中获取总页数

Scala 如何从pdf文件列表中获取总页数,scala,dictionary,Scala,Dictionary,我有一个5个pdf文件的列表,每个文件包含20页(假设)。我必须得到所有文件的总页数。答案是100页 我试过这个: val totalNumberOfFile = new File(uploadFolderPath) val fileList = totalNumberOfFile.listFiles() val totalPages = fileList.map(file => PDDocument.load(file).getNumberOfPages).sum 它给了我所需的答案,

我有一个5个pdf文件的列表,每个文件包含20页(假设)。我必须得到所有文件的总页数。答案是100页

我试过这个:

val totalNumberOfFile = new File(uploadFolderPath)
val fileList = totalNumberOfFile.listFiles()
val totalPages = fileList.map(file => PDDocument.load(file).getNumberOfPages).sum

它给了我所需的答案,但我的问题是:-在scala中这是最好的方法吗

答案取决于如果文件夹不存在或是空的,您想做什么。在这个例子中,我将简单地考虑在这种情况下页面的数量是零。 下面是一个使用现代Java文件API并将Java结构转换为Scala集合的示例。它将在Scala 2.13上运行,但如果在以前版本的Scala上运行,您可能需要导入
Scala.collection.JavaConverters.\uuz

import java.io.File
import java.nio.file._
import scala.jdk.CollectionConverters._

// This object is provided by your library, I only defined it so my example can compile
object PDFDocument {
  def load(f: File) = new { def getNumberOfPages: Int = 1 }
}

val dir = Paths.get("/your/path/here")
val stream = if (Files.exists(dir)) Files.newDirectoryStream(dir, "*.pdf").asScala.map(_.toFile) else Nil
val pages = stream.foldLeft(0)(_ + PDFDocument.load(_).getNumberOfPages)
最后一行使用
foldLeft
仅仅是编写
stream.map(…).sum
的一种奇特的(可能稍微更高效)方式,因此如果您或您的团队不习惯
折叠
习惯用法,您可能会选择后者。

例如,考虑自动资源管理和错误处理

scala.util.Using.Manager { use =>
  (new File(uploadFolderPath))
    .listFiles()
    .filter(_.getName.endsWith(".pdf"))
    .map(file => use(PDDocument.load(file)).getNumberOfPages)
    .sum
} match {
  case Success(sumOfPages) => println(sumOfPages)
  case Failure(error) => println("Failed to determine sum of pages", error)
}

是的,我认为这是一个很好的方法。当然,如果你觉得更好的话,你可以做到一行。但是如果
uploadFolderPath
为空或包含任何非PDF文件,我会抛出它。没有一个打开的文档被关闭。好的,那么您能否建议我如何更好地执行此操作,而不会出现任何错误或异常。