例如,考虑一个小文件。
one
two
three
four
five
six
seven
eight
nine
我想编写代码,该代码将采用一行迭代器
it: Iterator[String]
并制作一个迭代器 sectionIt: Iterator[Seq[String]]
来迭代这些部分。在 C# 和 Ruby 中,这可以使用 yield 关键字轻松实现。有 talk of how to add that keyword to scala ,但这取决于编译器插件。
创建
sectionIt
的一种方法是直接创建 Iterator[Seq[String]]
并覆盖 next
和 hasNext
。对于像 Scala 这样的高级语言来说,这种方法似乎是乏味的和状态密集的。我意识到流数据还有其他抽象,例如 Iteratees,这可能会使这更容易,但是对于正在学习新语言的人来说,这并不容易。
在 Scala 中编写上述代码的好方法是什么?
最佳答案
另一个答案的略有不同的版本:
def section(it: Iterator[String]): Iterator[Seq[String]] = {
def spanned(it: Iterator[String]): Stream[Seq[String]] =
if (!it.hasNext) Stream.empty
else { val (a, b) = it span (_ != "") ; a.toSeq #:: spanned(b drop 1) }
spanned(it).iterator
}
它有点懒惰,并且在空行之间阅读的行为是不同的:
scala> lazysplit.Test.splitOnBlankLines(f"%n%n%n%n%n".lines).size
res0: Int = 6
scala> lazysplit.Test.section(f"%n%n%n%n%n".lines).size
res1: Int = 5
关于scala - 如何将迭代器中的项 T 分组为 Iterator[Seq[T]],我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23771248/