Top Banner
Scala Simplifying Development ScalaDay Italy Milan, May 25, 2013 Mirco Dotta Saturday, May 25, 13
50
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Scala: Simplifying Development

ScalaSimplifying Development

ScalaDay ItalyMilan, May 25, 2013

Mirco Dotta

Saturday, May 25, 13

Page 2: Scala: Simplifying Development

Is Scala the Java of the future?

Saturday, May 25, 13

Page 3: Scala: Simplifying Development

• It has basically everything Java has now

• It has closures (planned for Java 8)

• It has rich interfaces (Java 8 defender methods), and more

• It is completely interoperable and runs about as fast as Java

Saturday, May 25, 13

Page 4: Scala: Simplifying Development

How is Scala different from Java?

Saturday, May 25, 13

Page 5: Scala: Simplifying Development

Concise SyntaxSaturday, May 25, 13

Page 6: Scala: Simplifying Development

public class Time { private final int hours; private final int minutes; public Time(int hours, int minutes) { this.hours = hours; this.minutes = minutes; } public int getHours() { return hours; } public int getMinutes() { return minutes; }}

class Time(val hours: Int, val minutes: Int)

Saturday, May 25, 13

Page 7: Scala: Simplifying Development

Statically typedbut feels dynamic

Saturday, May 25, 13

Page 8: Scala: Simplifying Development

val x = 2type is inferred

no semicolon

Saturday, May 25, 13

Page 9: Scala: Simplifying Development

Unifies OOP and FPSaturday, May 25, 13

Page 10: Scala: Simplifying Development

Every value is an object

Saturday, May 25, 13

Page 11: Scala: Simplifying Development

List(1,2,3).filter(x => x > 2) //> res: List[Int] = List(3)

Anonymous function Int => Boolean

List(1, 2, 3).filter( new Function[Int, Boolean] { def apply(x: Int): Boolean = x > 2 }) ///> res: List[Int] = List(3)

Functions are “just” objects

Saturday, May 25, 13

Page 12: Scala: Simplifying Development

Everything is an expression

Saturday, May 25, 13

Page 13: Scala: Simplifying Development

def max(x: Int, y: Int): Int = if (x > y) x else y

no return statement

val x: Int = { val y = 10 val z = 5 y + z}

blocks evaluate to last expression

Saturday, May 25, 13

Page 14: Scala: Simplifying Development

Every operation is a method call

Saturday, May 25, 13

Page 15: Scala: Simplifying Development

val x: Int = 10val y = x + 10

same as x.+(10)

Saturday, May 25, 13

Page 16: Scala: Simplifying Development

Principles, not Rules

Saturday, May 25, 13

Page 17: Scala: Simplifying Development

Users can write their own operators

Principle

Saturday, May 25, 13

Page 18: Scala: Simplifying Development

class Complex(val re: Int, val im: Int = 0) { def +(that: Complex) = new Complex(this.re + that.re, this.im + that.im)

override def toString = s"$re + $im"}

val c1 = new Complex(1, 2) //> c1 : Complex = 1 + 2val c2 = new Complex(2, 2) //> c2 : Complex = 2 + 2val c = c1 + c2 //> c : Complex = 3 + 4

default argument

Saturday, May 25, 13

Page 19: Scala: Simplifying Development

• new types can look like built-in ones

• “grow the language”

Saturday, May 25, 13

Page 20: Scala: Simplifying Development

Powerful collectionsSaturday, May 25, 13

Page 21: Scala: Simplifying Development

case class Time(hours: Int, minutes: Int = 0)

val times = List(Time(1), Time(2), Time(12,30), Time(16,15))

times.filter(time => time.hours >= 12) //> res: List[Time] = List(Time(12,30), Time(16,15))

times.map(time => Time(time.hours + 1, time.minutes)) //> res: List[Time] = List(Time(2,0), Time(3,0), Time(13,30), Time(17,15))

times.take(2) //> res: List[Time] = List(Time(1,0), Time(2,0))

times.groupBy(time => time.minutes) //> res: Map[Int,List[Time]] = Map(30 -> List(Time(12,30)), 15 -> List(Time(16,15)), 0 -> List(Time(1,0), Time(2,0)))

times.head //> res: Time = Time(1,0)times.last //> res: Time = Time(16,15)

Saturday, May 25, 13

Page 22: Scala: Simplifying Development

For-comprehension

Saturday, May 25, 13

Page 23: Scala: Simplifying Development

• More general than for-loops

• Used to iterate, filter, and generate new collections

Saturday, May 25, 13

Page 24: Scala: Simplifying Development

for (p <- persons; pr <- p.projects; if pr.overdue) yield p.name

may have any number of generators

guard construct a new collection of the same type, element by element

p is in scope for other generators

Saturday, May 25, 13

Page 25: Scala: Simplifying Development

times.filter(time => time.hours >= 12) //> res: List[Time] = List(Time(12,30), Time(16,15))

for(time <- times; if time.hours >= 12) yield time //>res: List[Time] = List(Time(12,30), Time(16,15))

times.map(time => Time(time.hours + 1, time.minutes)) //> res: List[Time] = List(Time(2,0), Time(3,0), Time(13,30), Time(17,15))

for(time <- times) yield Time(time.hours + 1, time.minutes) //> res: List[Time] = List(Time(2,0), Time(3,0), Time(13,30), Time(17,15))

Saturday, May 25, 13

Page 26: Scala: Simplifying Development

Desugared to calls to filter, map, and flatMap

Saturday, May 25, 13

Page 27: Scala: Simplifying Development

Readily available on any class implementing those methods!

Saturday, May 25, 13

Page 28: Scala: Simplifying Development

TraitsSaturday, May 25, 13

Page 29: Scala: Simplifying Development

• Like Java interfaces, but traits

• can have behavior (like Java 8 interfaces with defender methods)

• can have state

• enable multiple inheritance

Saturday, May 25, 13

Page 30: Scala: Simplifying Development

public interface Comparable<T> { int compareTo(int o);}

trait Comparable[T] { def compareTo(that: T): Int

}

def <(that: T): Boolean = (this compare that) < 0

def >(that: T): Boolean = (this compare that) > 0 //... Rich

InterfaceSaturday, May 25, 13

Page 31: Scala: Simplifying Development

Multiple Inheritance

• Traits can mix-in multiple traits

• Classes can mix-in multiple traits

• Both Class and Trait can inherit at most from one Class

Saturday, May 25, 13

Page 32: Scala: Simplifying Development

trait Bird { def fly: String = "I'm flying!"}

trait Swimmer { def swim: String = "I'm swimming!"}

class Fish extends Swimmer

class Duck extends Bird with Swimmer

Saturday, May 25, 13

Page 33: Scala: Simplifying Development

Embedding DSLsSaturday, May 25, 13

Page 34: Scala: Simplifying Development

val c = new Complex(1, 2) //> c : Complex = 1 + 2

Sum Complex & Int

How could we do it?

val c1 = 1 + c //> ???

val c1 = c + 1 //> ???

Saturday, May 25, 13

Page 35: Scala: Simplifying Development

val c1 = 1 + c //> ???

• This doesn’t compile because the type of c is not conform to the type expected by the + method

• In Java there would simply be no way to make this work

Saturday, May 25, 13

Page 36: Scala: Simplifying Development

Implicit ConversionsSaturday, May 25, 13

Page 37: Scala: Simplifying Development

• When there is a type error, the compiler looks for an implicit that could heal the expression

• You are already used to the idea of types being automatically converted into others

• E.g., Type coercion in Java!

int a = 2;double b = a;

int is converted into a double

Saturday, May 25, 13

Page 38: Scala: Simplifying Development

Scala gives you the power of creating your own conversions

Saturday, May 25, 13

Page 39: Scala: Simplifying Development

class RichInt(n: Int) { def +(other: Complex) = new Complex(n) + other}

Let’s create a class that can sum Int with Complex

val c = new Complex(1, 2) //> c : Complex = 1 + 2val c1 = RichInt(1) + c //> c1 : Complex = 2 + 2

Saturday, May 25, 13

Page 40: Scala: Simplifying Development

But, we want to write

val c1 = 1 + c

And not

val c1 = RichInt(1) + c

Saturday, May 25, 13

Page 41: Scala: Simplifying Development

Implicit conversion!Saturday, May 25, 13

Page 42: Scala: Simplifying Development

implicit def int2richInt(n: Int) = new RichInt(n)

val c = new Complex(1, 2) //> c : Complex = 1 + 2val c1 = 1 + c //> c1 : Complex = 2 + 2

And the compiler will take care of applying the conversion

val c1 = int2richInt(1) + c

Saturday, May 25, 13

Page 43: Scala: Simplifying Development

Scala simplifies development because...

Saturday, May 25, 13

Page 44: Scala: Simplifying Development

Less is More

Saturday, May 25, 13

Page 45: Scala: Simplifying Development

Few language constructs with high abstraction power

Saturday, May 25, 13

Page 46: Scala: Simplifying Development

It’s Fun!

Saturday, May 25, 13

Page 47: Scala: Simplifying Development

Good for your business?

Saturday, May 25, 13

Page 48: Scala: Simplifying Development

Saturday, May 25, 13

Page 49: Scala: Simplifying Development

Get Started in 5’

http://www.typesafe.com/platform/getstarted

Saturday, May 25, 13

Page 50: Scala: Simplifying Development

Thankstwitter: @mircodotta

Saturday, May 25, 13