我正在与一些使用类似迭代器功能的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
方法来模拟真实的迭代器,然后使用标准的集合方法,如takeWhile
和toSeq
。我不完全清楚this
和next
的类型,但沿着这条线可能会起作用:
Iterator.iterate(this){ _.next }.takeWhile{ _ != null }.map { sentence =>
Iterator.iterate(sentence.next) { _.next }.takeWhile{ _ != null }.toSeq
}.toSeq
您还可以通过定义自己的next
和hasNext
方法来扩展Iterable
,以便更容易地使用这些标准方法。您甚至可以定义从这些Java类型到这个新的Iterable
类型的隐式或显式转换——这与您在JavaConversions
和JavaConverters
中看到的模式相同