# 10.13. Transforming One Collection to Another with for/yield

## Problem

You want to create a new collection from an existing collection by transforming the elements with an algorithm.

## Solution

Use the `for`/`yield` construct and your algorithm to create the new collection. For instance, starting with a basic collection:

```scala> `val a = Array(1, 2, 3, 4, 5)`
a: Array[Int] = Array(1, 2, 3, 4, 5)```

You can create a copy of that collection by just “yielding” each element (with no algorithm):

```scala> `for (e <- a) yield e`
res0: Array[Int] = Array(1, 2, 3, 4, 5)```

You can create a new collection where each element is twice the value of the original:

```scala> `for (e <- a) yield e * 2`
res1: Array[Int] = Array(2, 4, 6, 8, 10)```

You can determine the modulus of each element:

```scala> `for (e <- a) yield e % 2`
res2: Array[Int] = Array(1, 0, 1, 0, 1)```

This example converts a list of strings to uppercase:

```scala> `val fruits = Vector("apple", "banana", "lime", "orange")`
fruits: Vector[String] = Vector(apple, banana, lime, orange)

scala> `val ucFruits = for (e <- fruits) yield e.toUpperCase`
ucFruits: Vector[String] = Vector(APPLE, BANANA, LIME, ORANGE)```

Your algorithm can return whatever collection is needed. This approach converts the original collection into a sequence of `Tuple2` elements:

```scala> `for (i <- 0 until fruits.length) yield (i, fruits(i))`
res0: scala.collection.immutable.IndexedSeq[(Int, String)] =
Vector((0,apple), (1,banana), (2,lime), (3,orange))```

This algorithm yields a sequence of `Tuple2` elements that contains each original ...

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.