我与一些使用类似迭代器功能的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]
}
答案 0 :(得分:1)
您可能尝试使用Iterator.iterate
方法来模拟真实迭代器,然后使用标准收集方法,如takeWhile
和toSeq
。我对this
和next
的类型并不完全清楚,但这些内容可能有用:
Iterator.iterate(this){ _.next }.takeWhile{ _ != null }.map { sentence =>
Iterator.iterate(sentence.next) { _.next }.takeWhile{ _ != null }.toSeq
}.toSeq
您还可以通过定义自己的Iterable
和next
方法来扩展hasNext
,以便更轻松地使用这些标准方法。您甚至可以定义从这些Java类型到这个新Iterable
类型的隐式或显式转换 - 这与您在JavaConversions
和JavaConverters