This is an excerpt from the 1st Edition of the Scala Cookbook (partially modified for the internet). This is Recipe 11.31, “How to Use a Range in Scala”
Problem
You want to see different ways to use a Range
in a Scala application.
Solution
Ranges are often used to populate data structures, and to iterate over for loops. Ranges provide a lot of power with just a few methods, as shown in these examples:
scala> 1 to 10 res0: scala.collection.immutable.Range.Inclusive = Range(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> 1 until 10 res1: scala.collection.immutable.Range = Range(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> 1 to 10 by 2 res2: scala.collection.immutable.Range = Range(1, 3, 5, 7, 9) scala> 'a' to 'c' res3: collection.immutable.NumericRange.Inclusive[Char] = NumericRange(a, b, c)
You can use ranges to create and populate sequences:
scala> val x = (1 to 10).toList x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val x = (1 to 10).toArray x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val x = (1 to 10).toSet x: scala.collection.immutable.Set[Int] = Set(5, 10, 1, 6, 9, 2, 7, 3, 8, 4)
Some sequences have a range
method in their objects to perform the same function:
scala> val x = Array.range(1, 10) x: Array[Int] = Array(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> val x = Vector.range(1, 10) x: collection.immutable.Vector[Int] = Vector(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> val x = List.range(1, 10) x: List[Int] = List(1, 2, 3, 4, 5, 6, 7, 8, 9) scala> val x = List.range(0, 10, 2) x: List[Int] = List(0, 2, 4, 6, 8) scala> val x = collection.mutable.ArrayBuffer.range('a', 'd') x: scala.collection.mutable.ArrayBuffer[Char] = ArrayBuffer(a, b, c)
Ranges are also commonly used in for
loops:
scala> for (i <- 1 to 3) println(i) 1 2 3
Discussion
In addition to the approaches shown, a Range
can be combined with the map
method to populate a collection:
scala> val x = (1 to 5).map { e => (e + 1.1) * 2 } x: scala.collection.immutable.IndexedSeq[Double] = Vector(4.2, 6.2, 8.2, 10.2, 12.2)
While discussing ways to populate collections, the tabulate
method is another nice approach:
scala> val x = List.tabulate(5)(_ + 1) x: List[Int] = List(1, 2, 3, 4, 5) scala> val x = List.tabulate(5)(_ + 2) x: List[Int] = List(2, 3, 4, 5, 6) scala> val x = Vector.tabulate(5)(_ * 2) x: scala.collection.immutable.Vector[Int] = Vector(0, 2, 4, 6, 8)
this post is sponsored by my books: | |||
#1 New Release |
FP Best Seller |
Learn Scala 3 |
Learn FP Fast |