2. Is Scala the Java of the
future?
Saturday, May 25, 13
3. • 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
4. How is Scala different
from Java?
Saturday, May 25, 13
6. 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
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
23. • More general than for-loops
• Used to iterate, filter, and generate new
collections
Saturday, May 25, 13
24. 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
29. • 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
31. 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
32. 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
34. 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
35. 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
37. • 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
38. Scala gives you the power of creating
your own conversions
Saturday, May 25, 13
39. 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 + 2
val c1 = RichInt(1) + c //> c1 : Complex = 2 + 2
Saturday, May 25, 13
40. But, we want to write
val c1 = 1 + c
And not
val c1 = RichInt(1) + c
Saturday, May 25, 13
42. implicit def int2richInt(n: Int) = new RichInt(n)
val c = new Complex(1, 2) //> c : Complex = 1 + 2
val 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