FWIW, вот что я хотел бы сделать (придерживаясь стандартной библиотеки):
def firstLine(f: java.io.File): Option[String] = {
val src = io.Source.fromFile(f)
try {
src.getLines.find(_ => true)
} finally {
src.close()
}
}
На что обратить внимание:
- Функция возвращает
Option[String]
вместо List[String]
, поскольку она всегда возвращает один или ни одного. Это более идиоматическая Скала.
-
src
должным образом закрыт, даже если есть вероятность, что вы сможете открыть файл, но чтение выдает исключение
- Использование
.find(_ => true)
для получения первого элемента Iterator
не дает мне хорошего самочувствия, но нет метода nextOption
, и это лучше, чем преобразование в промежуточный List
, который вы не используете .
IOException
s открытие или чтение файла передаются вместе.
Я также рекомендую использовать библиотеку scala-arm , чтобы предоставить вам лучший API для управления ресурсами и автоматического закрытия файлов при необходимости.
import resource._
def firstLine(f: java.io.File): Option[String] = {
managed(io.Source.fromFile(f)) acquireAndGet { src =>
src.getLines.find(_ => true)
}
}