|    270  |    270  | 
|    271 // this can be iterated |    271 // this can be iterated | 
|    272  |    272  | 
|    273 lst.map(square).filter(_ > 4) |    273 lst.map(square).filter(_ > 4) | 
|    274  |    274  | 
|    275 (lst.map(square) |    275 lst.map(square).find(_ > 4) | 
|         |    276 lst.map(square).find(_ > 4).map(double) | 
|         |    277  | 
|         |    278 lst.map(square) | 
|    276    .find(_ > 4) |    279    .find(_ > 4) | 
|    277    .map(square)) |    280    .map(double) | 
|    278  |    281  | 
|    279 lst.map(square).find(_ > 4) |    282  | 
|         |    283 // Option Type and maps | 
|         |    284 //====================== | 
|         |    285  | 
|         |    286 // a function that turns strings into numbers (similar to .toInt) | 
|         |    287 Integer.parseInt("12u34") | 
|         |    288  | 
|         |    289 // maps on Options | 
|         |    290  | 
|         |    291 import scala.util._ | 
|         |    292  | 
|         |    293 def get_me_an_int(s: String) : Option[Int] =  | 
|         |    294  Try(Some(Integer.parseInt(s))).getOrElse(None) | 
|         |    295  | 
|         |    296 get_me_an_int("12345").map(_ % 2 == 0) | 
|         |    297 get_me_an_int("12u34").map(_ % 2 == 0) | 
|         |    298  | 
|         |    299  | 
|         |    300  | 
|         |    301 val lst = List("12345", "foo", "5432", "bar", "x21", "456") | 
|         |    302 for (x <- lst) yield get_me_an_int(x) | 
|         |    303  | 
|         |    304 // summing up all the numbers | 
|         |    305  | 
|         |    306 lst.map(get_me_an_int).flatten.sum | 
|         |    307  | 
|         |    308  | 
|         |    309  | 
|    280  |    310  | 
|    281 // this is actually how for-comprehensions are |    311 // this is actually how for-comprehensions are | 
|    282 // defined in Scala |    312 // defined in Scala | 
|    283  |    313  | 
|    284 lst.map(n => square(n)) |    314 lst.map(n => square(n)) | 
|    286  |    316  | 
|    287 // lets define our own higher-order functions |    317 // lets define our own higher-order functions | 
|    288 // type of functions is for example Int => Int |    318 // type of functions is for example Int => Int | 
|    289  |    319  | 
|    290  |    320  | 
|    291 def my_map_int(lst: List[Int], f: Int => Int) : List[Int] = { |    321 def my_map_int(lst: List[Int], f: Int => Int) : List[Int] =  | 
|         |    322 { | 
|    292   if (lst == Nil) Nil |    323   if (lst == Nil) Nil | 
|    293   else f(lst.head) :: my_map_int(lst.tail, f) |    324   else f(lst.head) :: my_map_int(lst.tail, f) | 
|    294 } |    325 } | 
|    295  |    326  | 
|    296 my_map_int(lst, square) |    327 my_map_int(lst, square) | 
|    297  |         | 
|    298  |    328  | 
|    299 // same function using pattern matching: a kind |    329 // same function using pattern matching: a kind | 
|    300 // of switch statement on steroids (see more later on) |    330 // of switch statement on steroids (see more later on) | 
|    301  |    331  | 
|    302 def my_map_int(lst: List[Int], f: Int => Int) : List[Int] =  |    332 def my_map_int(lst: List[Int], f: Int => Int) : List[Int] =  | 
|    304     case Nil => Nil |    334     case Nil => Nil | 
|    305     case x::xs => f(x)::my_map_int(xs, f) |    335     case x::xs => f(x)::my_map_int(xs, f) | 
|    306   } |    336   } | 
|    307  |    337  | 
|    308  |    338  | 
|         |    339  | 
|         |    340 val biglst = (1 to 10000).toList | 
|         |    341 my_map_int(biglst, double) | 
|         |    342  | 
|         |    343 (1 to 10000000).toList.map(double) | 
|         |    344  | 
|    309 // other function types |    345 // other function types | 
|    310 // |    346 // | 
|    311 // f1: (Int, Int) => Int |    347 // f1: (Int, Int) => Int | 
|    312 // f2: List[String] => Option[Int] |    348 // f2: List[String] => Option[Int] | 
|    313 // ...  |    349 // ...  | 
|    314 val lst = (1 to 10).toList |    350  | 
|    315  |    351  | 
|    316 lst.sum |         | 
|    317  |         | 
|    318 val lst = List(1,2,3,4) |         | 
|    319  |         | 
|    320 lst.head |         | 
|    321 lst.tail |         | 
|    322  |         | 
|    323 def sumOf(f: Int => Int, lst: List[Int]): Int =  |         | 
|    324 lst match { |         | 
|    325   case Nil => 0 |         | 
|    326   case x::foo => f(x) + sumOf(f, foo) |         | 
|    327 } |         | 
|    328  |         | 
|    329 def sum_squares(lst: List[Int]) = sumOf(square, lst) |         | 
|    330 def sum_cubes(lst: List[Int])   = sumOf(x => x * x * x, lst) |         | 
|    331  |         | 
|    332 sum_squares(lst) |         | 
|    333 sum_cubes(lst) |         | 
|    334  |         | 
|    335 // lets try a factorial |         | 
|    336 def fact(n: Int) : Int =  |         | 
|    337   if (n == 0) 1 else n * fact(n - 1) |         | 
|    338  |         | 
|    339 def sum_fact(lst: List[Int]) = sumOf(fact, lst) |         | 
|    340 sum_fact(lst) |         | 
|    341  |         | 
|    342  |         | 
|    343  |         | 
|    344 // sometimes it is needed that you specify the type.  |         | 
|    345 (1 to 100).filter((x: Int) => x % 2 == 0).sum  |         | 
|    346  |         | 
|    347 // in this case it is clear that x must be an Int |         | 
|    348 (1 to 100).filter(x => x % 2 == 0).sum |         | 
|    349  |         | 
|    350 // When each parameter (only x in this case) is used only once |         | 
|    351 // you can use the wizardy placeholder syntax |         | 
|    352 (1 to 100).filter(_ % 2 == 0).sum |         | 
|    353  |         | 
|    354  |         | 
|    355  |         | 
|    356 // Option Type and maps |         | 
|    357 //====================== |         | 
|    358  |         | 
|    359 // a function that turns strings into numbers (similar to .toInt) |         | 
|    360 Integer.parseInt("12u34") |         | 
|    361  |         | 
|    362 import scala.util._ |         | 
|    363  |         | 
|    364 def get_me_an_int(s: String) : Option[Int] =  |         | 
|    365  Try(Some(Integer.parseInt(s))).getOrElse(None) |         | 
|    366  |         | 
|    367 val lst = List("12345", "foo", "5432", "bar", "x21", "456") |         | 
|    368 for (x <- lst) yield get_me_an_int(x) |         | 
|    369  |         | 
|    370 // summing up all the numbers |         | 
|    371  |         | 
|    372 lst.map(get_me_an_int).flatten.sum |         | 
|    373 lst.map(get_me_an_int).flatten.sum |         | 
|    374  |         | 
|    375 lst.flatMap(get_me_an_int).sum |         | 
|    376  |         | 
|    377 // maps on Options |         | 
|    378  |         | 
|    379 get_me_an_int("12345").map(even) |         | 
|    380 get_me_an_int("12u34").map(even) |         | 
|    381  |         | 
|    382 def my_map_option(o: Option[Int], f : Int => Int) : Option[Int] = { |         | 
|    383 o match { |         | 
|    384    case None => None |         | 
|    385    case Some(foo) => Some(f(foo)) |         | 
|    386 }} |         | 
|    387  |         | 
|    388 my_map_option(Some(4), square) |         | 
|    389 my_map_option(None, square) |         | 
|    390  |    352  | 
|    391  |    353  | 
|    392  |    354  | 
|    393 // Map type (upper-case) |    355 // Map type (upper-case) | 
|    394 //======================= |    356 //======================= |