用迭代器填充不可变序列

时间:2015-06-24 16:15:59

标签: scala iterator immutability

我与一些使用类似迭代器功能的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]
}

1 个答案:

答案 0 :(得分:1)

您可能尝试使用Iterator.iterate方法来模拟真实迭代器,然后使用标准收集方法,如takeWhiletoSeq。我对thisnext的类型并不完全清楚,但这些内容可能有用:

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

您还可以通过定义自己的Iterablenext方法来扩展hasNext,以便更轻松地使用这些标准方法。您甚至可以定义从这些Java类型到这个新Iterable类型的隐式或显式转换 - 这与您在JavaConversionsJavaConverters

中看到的模式相同