用迭代器填充不可变序列

populate immutable sequence with iterator

我正在与一些使用类似迭代器功能的 Java 代码进行互操作,并假设您将继续测试它的 .next 空值。我想将它放入不可变的 Scala 数据结构中,以便通过函数式编程对其进行推理。

现在,我正在填充可变数据结构,然后将它们转换为不可变数据结构。我知道有一种更实用的方法可以做到这一点。

如何在不使用中间可变集合的情况下重构下面的代码来填充不可变数据结构?

谢谢

{
 val sentences = MutableList[Seq[Token]]()
 while(this.next() != null){
   val sentence = MutableList[Token]()
   var token = this.next()
   while(token.next != null){
     sentence += token
     token = token.next
   }
   sentences += sentence.to[Seq]
 }
 sentences.to[Seq]
}

您可以尝试使用 Iterator.iterate 方法来模拟一个真正的迭代器,然后使用标准的收集方法,如 takeWhiletoSeq。我不是很清楚 thisnext 的类型,但是按照这些思路可能会起作用:

Iterator.iterate(this){ _.next }.takeWhile{ _ != null }.map { sentence =>
    Iterator.iterate(sentence.next) { _.next }.takeWhile{ _ != null }.toSeq
}.toSeq

您还可以通过定义自己的 nexthasNext 方法来扩展 Iterable,以便更轻松地使用这些标准方法。您甚至可以定义从这些 Java 类型到这个新的 Iterable 类型的隐式或显式转换——这与您在 JavaConversionsJavaConverters[=22= 中看到的模式相同]