Scala: Simplifying Development

50
Scala Simplifying Development ScalaDay Italy Milan, May 25, 2013 Mirco Dotta Saturday, May 25, 13

Transcript of Scala: Simplifying Development

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