Skip to content

Commit a99299d

Browse files
committed
map and flatMap (chapter 19)
1 parent d104f7c commit a99299d

4 files changed

Lines changed: 127 additions & 0 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package s4j.scala.chapter19
2+
3+
import java.util.Calendar
4+
5+
object FlatMapExample extends App {
6+
7+
def ageEitherSide(birthYear: Int): List[Int] = {
8+
val today = Calendar.getInstance.get(Calendar.YEAR)
9+
List(today - 1 - birthYear, today - birthYear, today + 1 - birthYear)
10+
}
11+
12+
val birthdays = List(1990, 1977, 1984)
13+
14+
println(birthdays.map(ageEitherSide))
15+
// outputs:
16+
// List(List(26, 27, 28), List(39, 40, 41), List(32, 33, 34))
17+
18+
println(birthdays.flatMap(ageEitherSide))
19+
// outputs:
20+
// List(24, 25, 26, 37, 38, 39, 30, 31, 32)
21+
22+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package s4j.scala.chapter19
2+
3+
class FlatMappable[A](elements: A*) {
4+
5+
def flatMap[B](f: A => List[B]): List[B] = {
6+
val result = collection.mutable.MutableList[B]()
7+
elements.foreach {
8+
f.apply(_).foreach {
9+
result += _
10+
}
11+
}
12+
result.toList
13+
}
14+
}
15+
16+
17+
package flatmap {
18+
19+
object Example extends App {
20+
21+
def oddNumbersTo(end: Int): List[Int] = {
22+
val odds = collection.mutable.MutableList[Int]()
23+
for (i <- 0 to end) {
24+
if (i % 2 != 0) odds += i
25+
}
26+
odds.toList
27+
}
28+
29+
val mappable = new FlatMappable(1, 2, 10)
30+
val result = mappable.flatMap(oddNumbersTo)
31+
println(result)
32+
}
33+
34+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package s4j.scala.chapter19
2+
3+
import java.util.Calendar
4+
5+
object MapExample {
6+
7+
def age(birthYear: Int) = {
8+
val currentYear = Calendar.getInstance.get(Calendar.YEAR)
9+
currentYear - birthYear
10+
}
11+
12+
val birthdays = List(1990, 1977, 1984, 1961, 1973)
13+
14+
birthdays.map(age) // = List(25, 38, 31, 54, 42)
15+
16+
// written in-line
17+
birthdays.map(year => Calendar.getInstance.get(Calendar.YEAR) - year)
18+
19+
// with shorthand parameter _
20+
birthdays.map(Calendar.getInstance.get(Calendar.YEAR) - _)
21+
22+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package s4j.scala.chapter19
2+
3+
class Mappable[A](elements: List[A]) {
4+
5+
def map[B](f: A => B): List[B] = {
6+
val result = collection.mutable.MutableList[B]()
7+
elements.foreach {
8+
result += f(_)
9+
}
10+
result.toList
11+
}
12+
13+
// recursive version (with a nested def)
14+
def recur_map[B](f: A => B): List[B] = {
15+
def recur(head: A, tail: List[A]): List[B] = {
16+
tail match {
17+
case Nil => List(f(head))
18+
case _ => f(head) +: recur(tail.head, tail.tail)
19+
}
20+
}
21+
22+
recur(elements.head, elements.tail)
23+
}
24+
25+
// tail recursive version
26+
def tail_recur_map[B](f: A => B): List[B] = {
27+
def recur(accumulator: List[B], elements: List[A]): List[B] = {
28+
elements match {
29+
case Nil => accumulator
30+
case head :: tail => recur(accumulator :+ f(head), tail)
31+
}
32+
}
33+
34+
recur(List[B](), elements)
35+
}
36+
}
37+
38+
package map {
39+
40+
object Example extends App {
41+
val numbers = List(1, 2, 54, 4, 12, 43, 54, 23, 34)
42+
val mappable = new Mappable(numbers)
43+
44+
println(mappable.map(_ * 2))
45+
println(mappable.recur_map(_ * 2))
46+
println(mappable.tail_recur_map(_ * 2))
47+
}
48+
49+
}

0 commit comments

Comments
 (0)