You can view what you are viewing. You can slice a TraversableView lazily.
The starting star is because REPL prints some result.
scala> val t: Traversable[Int] = Stream continually { println("*"); 42 } * t: Traversable[Int] = Stream(42, ?) scala> t.view.slice(0,2).size * res1: Int = 2 scala> val t: Traversable[Int] = Stream.fill(1) { println("*"); 42 } * t: Traversable[Int] = Stream(42, ?) scala> t.view.slice(0,2).size res2: Int = 1
The advantage is that there is no intermediate collection.
scala> val t: Traversable[_] = Map((1 to 10) map ((_, "x")): _*) t: Traversable[_] = Map(5 -> x, 10 -> x, 1 -> x, 6 -> x, 9 -> x, 2 -> x, 7 -> x, 3 -> x, 8 -> x, 4 -> x) scala> t.take(2) res3: Traversable[Any] = Map(5 -> x, 10 -> x)
This returns a non-optimized map, for example:
scala> res3.getClass res4: Class[_ <: Traversable[Any]] = class scala.collection.immutable.HashMap$HashTrieMap scala> Map(1->"x",2->"x").getClass res5: Class[_ <: scala.collection.immutable.Map[Int,String]] = class scala.collection.immutable.Map$Map2
source share