ScalaっぽくBufferedReaderを使う

BufferedReaderをScalaから使おうとすると、例えば以下の様になりますね。

val sb = new StringBuilder
var line = br.readLine
while(line!=null) {
  sb.append(line).append(System.lineSeparator)
  line = br.readLine
}
sb.toString

あまりにもScalaっぽくないので、implicit classを用いてIterableにしてみます。

implicit class IterableBufferedReader(br: BufferedReader) extends Iterable[String] {
  def iterator: Iterator[String] = Iterator.continually(br.readLine).takeWhile(_ != null)
}
br.mkString(System.lineSeparator)

Loan Patternと組み合わせるともっとシンプルですね。

def using[A](br: BufferedReader)(body: Iterator[String] => A): A = {
  try {
    body(Iterator.continually(br.readLine).takeWhile(_ != null))
  } finally {
    br.close
  }
}
using(br) ( _.mkString(System.lineSeparator) )