例如,考虑一个小文件。

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]] 并覆盖 nexthasNext 。对于像 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/

10-16 01:54