如何归纳'Seq [String] => Seq [Int]'和'Iterator [String] => Iterator [Int]'的实现以进行文件处理?

假设我有一个函数Seq[String] => Seq[Int],例如def len(as: Seq[String]): Int = as.map(_.length)。现在我想将此功能应用于文本文件,例如将 all 文件行转换为数字。

我读为scala.io.Source.fromFile("/tmp/xxx.txt").getLines的文本文件,该文件返回迭代器。
我可以使用toListto(LazyList)将迭代器“转换”为Seq,然后将整个文件读入内存。

所以我需要编写另一个函数Iterator[String] => Iterator[Int],它实际上是Seq[String] => Seq[Int]复制的版本。这是对的吗 ?避免重复代码的最佳方法是什么?

huangchaoqi 回答:如何归纳'Seq [String] => Seq [Int]'和'Iterator [String] => Iterator [Int]'的实现以进行文件处理?

如果您有任意个函数Seq[String] => Seq[Int],则

  

我使用toList或to(LazyList)将迭代器“转换”为Seq,但在两种情况下,我都读取了内存中的整个文件。

是您可以做的最好的事情,因为该功能可以通过查看Seq[String]的末尾或其长度等开始。

Scala不允许您在函数内部“查看”并得出“它是map(something),我可以对迭代器执行相同的map”(有一些关于宏的警告,但是这里不是很有用)。

  

因此,我需要编写另一个函数Iterator[String] => Iterator[Int],它实际上是Seq[String] => Seq[Int]的复制版本。这是对的吗 ?避免重复代码的最佳方法是什么?

如果控制函数的定义,则可以使用类型更高级的类型来定义对两种情况都适用的函数。例如。在Scala 2.13中

def len[C[A] <: IterableOnceOps[A,C,C[A]]](as: C[String]): C[Int] = as.map(_.length)

val x: Seq[Int] = len(Seq("a","b"))      
val y: Iterator[Int] = len(Iterator("a","b"))
本文链接:https://www.f2er.com/2994458.html

大家都在问