background-image: url(../img/fp-tower/website-background.svg) class: center, middle, white .title[Iteration with for loops] --- # For loop
```scala val list = List(1, 8, -3, 12) ``` ```scala for (number <- list) { println(s"number is $number") } // number is 1 // number is 8 // number is -3 // number is 12 ``` --- # Without `s` String interpolator
```scala val list = List(1, 8, -3, 12) ``` ```scala for (number <- list) { println("number is $number") } // number is $number // number is $number // number is $number // number is $number ``` --- # Other String interpolators .forty-two-left[ ## In standard library ```scala println(f"PI is ${Math.PI}%1.2f") // PI is 3.14 ``` ] .fifty-two-right[ ## In other libraries ```scala val subject = "functional programming" println(sql"subject = $subject") // res: Fragment = Fragment("subject = ?") ``` ```scala val names = List("Eda", "Bob") json"{ names : $names }" // res: Json = "{ "names" : ["Eda", "Bob"] }" ``` ] --- # Code block: curly braces .forty-seven-left[ ## Optional ```scala for (number <- list) println(s"number is $number") // number is 1 // number is 8 // number is -3 // number is 12 ``` ] .forty-seven-right[ ## Mandatory ```scala for (number <- list) { val square = number * number println(s"number square is $square") } // number square is 1 // number square is 64 // number square is 9 // number square is 144 ``` ] --- # Code block: curly braces .forty-seven-left[ ## Optional ```scala for (number <- list) println(s"number is $number") // number is 1 // number is 8 // number is -3 // number is 12 ``` ] .forty-seven-right[ ## Optional in Scala 3 ```scala for (number <- list) val square = number * number println(s"number square is $square") // number square is 1 // number square is 64 // number square is 9 // number square is 144 ``` ] --- # For loop is a syntax for foreach
.forty-seven-left[ ```scala for (number <- list) println(s"number is $number") // number is 1 // number is 8 // number is -3 // number is 12 ``` ] .forty-seven-right[ ```scala list.foreach(number => println(s"number is $number") ) // number is 1 // number is 8 // number is -3 // number is 12 ``` ] --
```scala trait List[A] { def foreach[To](action: A => To): Unit } ``` --- # For loop is a syntax for foreach
.forty-seven-left[ ```scala for (number <- list) println(s"number is $number") // number is 1 // number is 8 // number is -3 // number is 12 ``` ] .forty-seven-right[ ```scala list.foreach(number => println(s"number is $number") ) // number is 1 // number is 8 // number is -3 // number is 12 ``` ]
```scala trait List[A] { def foreach[To](action: A => To): Unit def map [To](update: A => To): List[To] } ``` --- # For loop is a syntax for foreach
.forty-seven-left[ ```scala for (number <- Point(1, 5)) println(s"number is $number") // number is 1 // number is 5 ``` ] .forty-seven-right[ ```scala Point(1, 5).foreach(number => println(s"number is $number") ) // number is 1 // number is 5 ``` ]
```scala case class Point(first: Int, second: Int) { def foreach[To](action: Int => To): Unit = { action(first) action(second) } } ``` --- # Nested for loop ```scala val shapes = List("triangle", "square") val colours = List("red", "green", "blue") ``` .forty-seven-left[ ```scala for { shape <- shapes colour <- colours } println(s"The $shape is $colour") // The triangle is red // The triangle is green // The triangle is blue // The square is red // The square is green // The square is blue ``` ] .forty-seven-right[ ```scala shapes.foreach{ shape => colours.foreach { colour => println(s"The $shape is $colour") } } // The triangle is red // The triangle is green // The triangle is blue // The square is red // The square is green // The square is blue ``` ] --- # Nested for loop with different data types ```scala val shapes = List("triangle", "square") val point = Point(2, 5) ``` .forty-seven-left[ ```scala for { shape <- shapes number <- point } println(s"There is $number ${shape}(s)") // There is 2 triangle(s) // There is 5 triangle(s) // There is 2 square(s) // There is 5 square(s) ``` ] .forty-seven-right[ ```scala shapes.foreach{ shape => point.foreach { number => println(s"There is $number ${shape}(s)") } } // There is 2 triangle(s) // There is 5 triangle(s) // There is 2 square(s) // There is 5 square(s) ``` ] --- # Use case .forty-seven-left[
```scala def sum(numbers: List[Int]): Int ``` ```scala sum(List(1, 8, -3, 12)) // res: Int = 18 ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total = total + number total } ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total += number total } ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total += number total } ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total += number total } ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total += number total } ``` ] .forty-seven-right[
] --- # For loop with mutable state .forty-seven-left[
```scala def sum(numbers: List[Int]): Int = { var total = 0 for (number <- numbers) total += number total } ``` ```scala sum(List(1, 8, -3, 12)) // res20: Int = 18 ``` ] .forty-seven-right[
] --- background-image: url(../img/fp-tower/website-background-white.svg) class: middle, white # ForLoopExercises.scala --- background-image: url(../img/foundation/iteration-for-pattern-1.svg) --- background-image: url(../img/foundation/iteration-for-pattern-2.svg) --- background-image: url(../img/foundation/iteration-for-pattern-3.svg) --- background-image: url(../img/foundation/iteration-for-pattern-4.svg) --- background-image: url(../img/foundation/iteration-for-pattern-5.svg) --- background-image: url(../img/foundation/iteration-for-pattern-6.svg) --- background-image: url(../img/foundation/iteration-for-pattern-7.svg) --- background-image: url(../img/foundation/iteration-for-pattern-8.svg) --- background-image: url(../img/foundation/iteration-for-pattern-9.svg) --- background-image: url(../img/fp-tower/website-background-white.svg) class: middle, white # ForLoopExercises.scala --- class: white background-image: url(../img/fp-tower/website-background.svg)
# .white[Summary]
.large[ * For loop syntax * Iterate over a List * foldLeft ]