Slide 1

Slide 1 text

INTRO TO SCALA Scala is.. (functional, OO, extensible, fast, concurrent, Java, statically typed...)

Slide 2

Slide 2 text

WHO USES SCALA? /47 DEGREES AND... H SBC KLO U T LIN KEDIN LIVIN G SO C IAL Q U O RA REM EM BER TH E M ILK SEESM IC STAC KM O B TW ITTER TU M BLR VM W ARE YAM M ER N O VEL AO L BO X E-H ARM O N Y http://www.quora.com/Startups/What-startups-or-tech-companies-are-using-Scala

Slide 3

Slide 3 text

SCALA FEATURES /JUST A FEW... High Order functions and great support for map, flatmap, tabulate, filter, foreach... Traits, classes, case classes, object... Attach behaviors at runtime. new Foo with Other Flexible syntax, create constructs, infix support, everything is a value val test = if(...) val collection = for(...) Emphasis on immutable data structures. Transformations and copies vs state Built in support for this high concurrency pattern IMMUTABILITY EMPHASIS FUNCTIONAL OOP ACTORS MIXINS IDIOMATIC

Slide 4

Slide 4 text

IMMUTABILITY In Java we tend to use Mutable structures that need synchronization JAVA List even = new ArrayList(); for (String num : numbersAsStrings) { int parsedInt = Integer.parseInt(num); if (parsedInt % 2 == 0) { ints.add(parsedInt); } } In Scala we transform values into new values SCALA val ints = for (num <- numbersAsStrings; if num.toInt % 2 == 0) yield num.toInt No need to synchronize in structures which state is never modified

Slide 5

Slide 5 text

FUNCTIONAL In Scala everything returns a value scala> val myInt = 1 myInt: Int = 1 scala> def myFunction = "I don't need a return" myFunction: String scala> val result = for (n <- 0 to 10) yield n result: scala.collection.immutable.IndexedSeq[Int] = Vector(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10) scala> val ifAreValues2 = if (true) "test" ifAreValues2: Any = test scala> val ifAreValues3 = if (true) "test" else "test2" ifAreValues3: String = test Functional style encourages to pipe the results of functions and operations Vs Imperative style Iterator.continually(Option(queue.poll(1, TimeUnit.SECONDS))).takeWhile(_ => running) foreach { msg => write(msg) }

Slide 6

Slide 6 text

OOP In Scala everything is an Object and supports a richer object model than Java ( multiple inheritance? :) ) Traits trait Similarity { def isSimilar(x: Any): Boolean def isNotSimilar(x: Any): Boolean = !isSimilar(x) } Classes class Point(xc: Int, yc: Int) extends Similarity { var x: Int = xc var y: Int = yc def isSimilar(obj: Any) = obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x } Case Classes case class Point(xc: Int, yc: Int) extends Similarity { def isSimilar(obj: Any) = obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x } Objects (singletons) object TraitsTest { val p1 = Point(2, 3) val p2 = Point(2, 4) val p3 = Point(3, 3) println(p1.isNotSimilar(p2)) println(p1.isNotSimilar(p3)) println(p1.isNotSimilar(2)) }

Slide 7

Slide 7 text

ACTORS Use actors for a high concurrent fault tolerant distributed messaging system /** invoke your army **/ val emailServiceActor = Akka.system.actorOf( Props[EmailServiceActor].withRouter( SmallestMailboxRouter(nrOfInstances = 50) ), name = "emailService" ) /** send him to war **/ emailServiceActor ! emailMessage /** this is the guy overseeing everything in the pentagon **/ class EmailServiceActor extends Actor{ override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10) { case emailException: EmailException => Restart case unknownCase: Any => Stop } def receive = { case message: Any => context.actorOf(Props[EmailServiceWorker]) ! message } } /** And this one is the one in the field **/ class EmailServiceWorker extends Actor{ /** And this one is the one in the field **/ private var emailMessage: Option[EmailMessage] = None def receive = { case Some(email): EmailMessage => { email.deliveryAttempts = email.deliveryAttempts + 1 email sendEmailSync() } case unexpectedMessage: Any => throw new Exception("can't handle %s" format(unexpectedMessage)) } override def preRestart(reason: Throwable, message: Option[Any]) { context.system.scheduler.scheduleOnce(emailMessage.get.retryOn, self, emailMessage.get) } }

Slide 8

Slide 8 text

MIXINS A fish that can walk? trait Walker { def walk = println("I'm walking")} trait Swimmer { def swim = println("I'm swimming")} class Fish extends Swimmer ... val mudSkipper = new Fish() with Walker mudSkipper.walk()

Slide 9

Slide 9 text

IDIOMATIC DSL capable and idiomatic syntax http://stackoverflow.com/questions/3186783/interesting-dsls-implemented-in-scala /** Poll every second and stream messages **/ Iterator.continually( Option(queue .poll(1, TimeUnit.SECONDS))) .takeWhile(_ => running) foreach { msg => write(msg) } /** TDD and BDD ? **/ test("pop is invoked on an empty stack") { val emptyStack = new Stack[String] evaluating { emptyStack.pop() } should produce [NoSuchElementException] emptyStack should be ('empty) } /** DB manipulation ? **/ def songCountByArtistId: Query[GroupWithMeasures[Long,Long]] = from(artists, songs)((a,s) => where(a.id === s.artistId) groupBy(a.id) compute(count) ) /** Json manipulation ? **/ ("person" -> ("name" -> "Joe") ~ ("age" -> 35) ~ ("spouse" -> ("person" -> ("name" -> "Marilyn") ~ ("age" -> 33) ) ) ) /** Xml manipulation ? **/ val page = Hello XHTML world

Hello world

;

Slide 10

Slide 10 text

SCALA ECOSYSTEM /JUST A FEW...

Slide 11

Slide 11 text

LEARN SCALA /BOOKS

Slide 12

Slide 12 text

LEARN SCALA /FREE ONLINE COURSES

Slide 13

Slide 13 text

WORLD DOMINATION IS UNDERWAY /GET ON THE WAGON BEFORE ITS TOO LATE

Slide 14

Slide 14 text

WHY LEARN SCALA? /A MODERN LANGUAGE FOR MASSIVE CONCURRENT APPLICATIONS IN THE CLOUD

Slide 15

Slide 15 text

THANKS AND SEE YOU AT SCALA DAYS 2013! SCALADAYS.ORG 47deg.com raulraja.com @raulraja