Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterators for mutable collections in Scala?

I just found out that there are such iterators in Java.
Does Scala have iterators with 'set' and 'remove' methods for iterating (and modifying) mutable collections like array?
If there is no such iterator then is there a good reason for that?

like image 973
Łukasz Lew Avatar asked May 10 '10 13:05

Łukasz Lew


2 Answers

Scala does not currently have such an iterator.

I suspect that it does not because

  • Such iterators are not general (i.e they are only usable with mutable collections) but consume namespace.

  • Because they can rapidly become confusing to think about in conjunction with lazy operations like takeWhile (Is it always obvious what x.takeWhile(_<5).add(5) should do? On the one hand, the order of operations seems like you should take first, and then add; but on the other, take is lazy while add can often be implemented immediately, so combining them this way would be dangerous naively.)

  • Such iterators are only a good idea algorithmically with a very specialized set of collections (basically only linked lists and trees; add and remove is foolish to use on arrays anyway, and it doesn't make much sense on sets).

  • When an intrinsic conflict arises between generality and speed, the Scala collections library typically favors generality. This sort of iterator makes you think about the collections in a more particular way (i.e. more closely tied to the underlying data structure). You could imagine a library that made different choices, but for a maximally useful (and still quite performant) library, the Scala collections library philosophy is probably the better way to go.

like image 58
Rex Kerr Avatar answered Sep 18 '22 12:09

Rex Kerr


Thread on the same topic on comp.lang.scala.user

like image 32
Łukasz Lew Avatar answered Sep 21 '22 12:09

Łukasz Lew