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 O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.