2

我有一些代码需要在迭代另一个序列时将元素添加到序列中。在scala中哪种方式是“首选”或者更好的方式,为什么?:

方式一:

val builder = Seq.newBuilder[String]    
for(i <- iterator){
builder += i  //Everytime I want to add a new element    
}

方式二:

val stringSeq = iterator.foldLeft(Seq[String]()){
case (acc, i) => i +: acc
}
4

3 回答 3

2

为什么不同时使用两者,既实用又高效?

iterator.foldLeft(Seq.newBuilder[String])(_ += _).result

请注意,此代码的行为与您的第二个解决方案的行为略有不同:您的解决方案反转了迭代器的顺序,我的保留了它。我不知道哪个是想要的。

另外,以防万一您没有想到(对不起,如果我很明显),您不使用的任何特殊原因iterator.toSeq

于 2014-05-20T10:17:55.703 回答
1

我会说方式 2更惯用,感觉更实用,因为你不创建可变状态。

方式 1似乎更具命令性,因为它类似于在for面向对象编程中使用。

然而,Scala 同时具有 OOP 元素和 FP 元素。我想你应该使用一个对你更有效的构造,例如由于性能原因(但是我不认为你的例子是这种情况,因为附加到头部Seq应该很快)。

PS。你的发电机应该<-不是<,它是foldLeft(大写L

于 2014-05-19T08:39:14.420 回答
1

有一个++:方法Seq,所以你可以这样做seq ++: iterator

不用担心性能,它是 Scala 提供给我们的基本 API,我们应该相信它。

实际上,当前的实现类似于您的方式 1。

于 2014-05-19T09:15:57.640 回答