Scala Iterator的自定义mkString函数

时间:2017-05-30 14:11:49

标签: scala

给定Iterator[String],使用mkString创建csv String很容易:

//Result: "1,2,3,4,5"
Iterator("1","2","3","4","5").mkString(",")

mkString的问题在于它会消耗内存来保存整个结果字符串。

是否可以将转换应用于原始迭代器,该转换器提供与mkString相同的输出但不会将内存与整个结果联系起来?

val csvIter : Iterator[String] = doSomething(Iterator("1","2","3","4","5"))

出于测试目的,以下表达式应返回true:

val originalIter : Iterator[String] = ???

originalIter.mkString(",") == doSomething(originalIter).reduceOption(_ + _).getOrElse("")

提前感谢您的考虑和回应。

2 个答案:

答案 0 :(得分:1)

这是一个在处理所有其他元素之前处理第一个元素的解决方案:

def mkString(it: Iterator[String]) = if (it.hasNext)
  Iterator(it.next()) ++ it.map("," + _)
else it

答案 1 :(得分:1)

不知道这对你是否重要,但这会将分隔符交错为不同的元素:

def mkString(iter: Iterator[String], sep: String) = new Iterator[String] {
  var nextIsSep = false
  def hasNext: Boolean = iter.hasNext
  def next(): String = {
    val result = if (nextIsSep) sep else iter.next()
    nextIsSep = !nextIsSep
    result
  }
}