在 Scala 中处理 InputStream
Handling InputStream in Scala
我有一个将 inputStream 作为参数的方法。一个InputStream,包含以下内容
输入:
一行包含一个数字:N
后跟 N 行,包含两个数字 Ti 和 Li,由 space 分隔。
可能有尾随换行符。
问题是:如何在 Scala 中读取和操作流?
def process(in: InputStream): Long = ???
以下代码示例从第一行读取 n,然后为每一行计算 ti * li 与总和的乘积。
import java.io.InputStream
import java.io.ByteArrayInputStream
import java.nio.charset.StandardCharsets
import scala.io.Source
import scala.util.matching.Regex
def process(in: InputStream): Long = {
val lines = Source.fromInputStream(in).getLines()
val n = lines.next().toInt
val pattern: Regex = """\s*(\d+)\s+(\d+)\s*""".r
lines.map {
case pattern(ti, li) => ti.toInt * li.toInt
case _ => 0
}.sum
}
test("process InputStream") {
val lines =
raw"""3
|1 10
|2 200
|3 3000
|""".stripMargin
println(lines)
val is: InputStream = new ByteArrayInputStream(lines.getBytes(StandardCharsets.UTF_8))
assert(process(is) == 9410)
}
我有一个将 inputStream 作为参数的方法。一个InputStream,包含以下内容
输入:
一行包含一个数字:N
后跟 N 行,包含两个数字 Ti 和 Li,由 space 分隔。
可能有尾随换行符。
问题是:如何在 Scala 中读取和操作流?
def process(in: InputStream): Long = ???
以下代码示例从第一行读取 n,然后为每一行计算 ti * li 与总和的乘积。
import java.io.InputStream
import java.io.ByteArrayInputStream
import java.nio.charset.StandardCharsets
import scala.io.Source
import scala.util.matching.Regex
def process(in: InputStream): Long = {
val lines = Source.fromInputStream(in).getLines()
val n = lines.next().toInt
val pattern: Regex = """\s*(\d+)\s+(\d+)\s*""".r
lines.map {
case pattern(ti, li) => ti.toInt * li.toInt
case _ => 0
}.sum
}
test("process InputStream") {
val lines =
raw"""3
|1 10
|2 200
|3 3000
|""".stripMargin
println(lines)
val is: InputStream = new ByteArrayInputStream(lines.getBytes(StandardCharsets.UTF_8))
assert(process(is) == 9410)
}