Как получить общее количество страниц из списка файлов PDF - PullRequest
1 голос
/ 07 января 2020

У меня есть список из 5 PDF-файлов, содержащий по 20 страниц каждый (предположим). Я должен получить общее количество страниц всех файлов. ответ будет 100 страниц.

Я пробовал это:

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

Это дает мне требуемый ответ, но мой вопрос: - Это лучший способ сделать это в scala

Ответы [ 2 ]

1 голос
/ 07 января 2020

Рассмотрим scala.util.Using для автоматов c управление ресурсами и обработка ошибок, например

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)
}
1 голос
/ 07 января 2020

Ответ зависит от того, что вы хотите сделать, если папка не существует или пуста. В этом примере я просто буду считать, что количество страниц в этом случае равно нулю.

Вот пример использования современного Java Файлового API и преобразования структур Java в коллекции Scala. Он будет работать на Scala 2.13, но вы можете вместо этого импортировать scala.collection.JavaConverters._, если работаете на предыдущих версиях Scala.

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, поэтому вы можете предпочесть более поздний, если вы или ваша команда не привыкли к fold идиомам.

...