3.1. Looping with for and foreach

Problem

You want to iterate over the elements in a collection, either to operate on each element in the collection, or to create a new collection from the existing collection.

Solution

There are many ways to loop over Scala collections, including for loops, while loops, and collection methods like foreach, map, flatMap, and more. This solution focuses primarily on the for loop and foreach method.

Given a simple array:

val a = Array("apple", "banana", "orange")

I prefer to iterate over the array with the following for loop syntax, because it’s clean and easy to remember:

scala> for (e <- a) println(e)
apple
banana
orange

When your algorithm requires multiple lines, use the same for loop syntax, and perform your work in a block:

scala> for (e <- a) {
     |   // imagine this requires multiple lines
     |   val s = e.toUpperCase
     |   println(s)
     | }
APPLE
BANANA
ORANGE

Returning values from a for loop

Those examples perform an operation using the elements in an array, but they don’t return a value you can use, such as a new array. In cases where you want to build a new collection from the input collection, use the for/yield combination:

scala> val newArray = for (e <- a) yield e.toUpperCase
newArray: Array[java.lang.String] = Array(APPLE, BANANA, ORANGE)

The for/yield construct returns a value, so in this case, the array newArray contains uppercase versions of the three strings in the initial array. Notice that an input Array yields an Array (and not something else, like a Vector ...

Get Scala Cookbook now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.