scala: simplifying development
TRANSCRIPT
ScalaSimplifying Development
ScalaDay ItalyMilan, May 25, 2013
Mirco Dotta
Saturday, May 25, 13
Is Scala the Java of the future?
Saturday, May 25, 13
• 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
How is Scala different from Java?
Saturday, May 25, 13
Concise SyntaxSaturday, May 25, 13
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
Statically typedbut feels dynamic
Saturday, May 25, 13
val x = 2type is inferred
no semicolon
Saturday, May 25, 13
Unifies OOP and FPSaturday, May 25, 13
Every value is an object
Saturday, May 25, 13
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
Everything is an expression
Saturday, May 25, 13
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
Every operation is a method call
Saturday, May 25, 13
val x: Int = 10val y = x + 10
same as x.+(10)
Saturday, May 25, 13
Principles, not Rules
Saturday, May 25, 13
Users can write their own operators
Principle
Saturday, May 25, 13
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
• new types can look like built-in ones
• “grow the language”
Saturday, May 25, 13
Powerful collectionsSaturday, May 25, 13
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
For-comprehension
Saturday, May 25, 13
• More general than for-loops
• Used to iterate, filter, and generate new collections
Saturday, May 25, 13
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
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
Desugared to calls to filter, map, and flatMap
Saturday, May 25, 13
Readily available on any class implementing those methods!
Saturday, May 25, 13
TraitsSaturday, May 25, 13
• 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
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
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
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
Embedding DSLsSaturday, May 25, 13
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
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
Implicit ConversionsSaturday, May 25, 13
• 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
Scala gives you the power of creating your own conversions
Saturday, May 25, 13
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
But, we want to write
val c1 = 1 + c
And not
val c1 = RichInt(1) + c
Saturday, May 25, 13
Implicit conversion!Saturday, May 25, 13
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
Scala simplifies development because...
Saturday, May 25, 13
Less is More
Saturday, May 25, 13
Few language constructs with high abstraction power
Saturday, May 25, 13
It’s Fun!
Saturday, May 25, 13
Good for your business?
Saturday, May 25, 13
Saturday, May 25, 13
Get Started in 5’
http://www.typesafe.com/platform/getstarted
Saturday, May 25, 13
Thankstwitter: @mircodotta
Saturday, May 25, 13