使用迭代器填充不可变序列



我正在与一些使用类似迭代器功能的Java代码进行互操作,并假设您将继续测试它的.next是否为null值。我想把它放在不可变的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 中看到的模式相同

最新更新