458   println(cnt)  | 
   458   println(cnt)  | 
   459 }  | 
   459 }  | 
   460   | 
   460   | 
   461 test()  | 
   461 test()  | 
   462   | 
   462   | 
   463 // Option type  | 
         | 
   464 //=============  | 
         | 
   465   | 
         | 
   466 //in Java if something unusually happens, you return null or something  | 
         | 
   467 //  | 
         | 
   468 //in Scala you use Options instead  | 
         | 
   469 //   - if the value is present, you use Some(value)  | 
         | 
   470 //   - if no value is present, you use None  | 
         | 
   471   | 
         | 
   472   | 
         | 
   473 List(7,2,3,4,5,6).find(_ < 4)  | 
         | 
   474 List(5,6,7,8,9).find(_ < 4)  | 
         | 
   475   | 
         | 
   476   | 
         | 
   477   | 
         | 
   478 // error handling with Options (no exceptions)  | 
         | 
   479 //  | 
         | 
   480 //  Try(something).getOrElse(what_to_do_in_case_of_an_exception)  | 
         | 
   481 //  | 
         | 
   482 import scala.util._  | 
         | 
   483 import io.Source  | 
         | 
   484   | 
         | 
   485 val my_url = "https://nms.kcl.ac.uk/christian.urban/"  | 
         | 
   486   | 
         | 
   487 Source.fromURL(my_url).mkString  | 
         | 
   488   | 
         | 
   489 Try(Source.fromURL(my_url).mkString).getOrElse("") | 
         | 
   490   | 
         | 
   491 Try(Some(Source.fromURL(my_url).mkString)).getOrElse(None)  | 
         | 
   492   | 
         | 
   493   | 
         | 
   494 // the same for files  | 
         | 
   495 Try(Some(Source.fromFile("text.txt").mkString)).getOrElse(None) | 
         | 
   496   | 
         | 
   497   | 
         | 
   498   | 
         | 
   499 // how to implement a function for reading something from files...  | 
         | 
   500   | 
         | 
   501 def get_contents(name: String) : List[String] =   | 
         | 
   502   Source.fromFile(name).getLines.toList  | 
         | 
   503   | 
         | 
   504 get_contents("test.txt") | 
         | 
   505   | 
         | 
   506 // slightly better - return Nil  | 
         | 
   507 def get_contents(name: String) : List[String] =   | 
         | 
   508   Try(Source.fromFile(name).getLines.toList).getOrElse(List())  | 
         | 
   509   | 
         | 
   510 get_contents("text.txt") | 
         | 
   511   | 
         | 
   512 // much better - you record in the type that things can go wrong   | 
         | 
   513 def get_contents(name: String) : Option[List[String]] =   | 
         | 
   514   Try(Some(Source.fromFile(name).getLines.toList)).getOrElse(None)  | 
         | 
   515   | 
         | 
   516 get_contents("text.txt") | 
         | 
   517 get_contents("test.txt") | 
         | 
   518   | 
         | 
   519   | 
   463   | 
   520   | 
   464   | 
   521   | 
   465   | 
   522 // Further Information  | 
   466 // Further Information  | 
   523 //=====================  | 
   467 //=====================  |