a scala firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/billvenners_scalafirehosecompre… ·...

57
A Scala Firehose Bill Venners President Artima, Inc. www.artima.com

Upload: others

Post on 22-Aug-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

A Scala Firehose

Bill Venners

President

Artima, Inc.

www.artima.com

Page 2: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Enough about me:

• Run the Artima Developer website• Existing investment in Java knowledge and

code• Wanted a more productive language for JVM• Didn’t want to give up static typing• Scala fit my needs• Scala book, ScalaTest

Page 3: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

A bit about Scala:

• Designed by Martin Odersky

Scala is:• A Scalable language• Object-oriented• Functional• Statically typed

Page 4: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

A Scalable language

• From scripts to systems• Grow new types• Grow new control constructs

Design libraries that enableclear, concise client code

that feels like native language support.

Page 5: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scalable language means:

1. From scripts to systems

Page 6: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Ruby:

class Hello {

public static void main(String[] args) {System.out.println("Hello, world!");

}}

Java:

puts "Hello, world!"

Page 7: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala

println("Hello, world!")

Page 8: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scalable language means:

2. Extensible by growing new types

Page 9: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Java's if statement:

if (a > b)System.out.println(a);

elseSystem.out.println(b);

int m = (a > b) ? a : b;System.out.println(m);

Java’s ternary operator:

Page 10: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala’s if expression:

val m = if (a > b) a else bprintln(m)

Page 11: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

if (x == BigInteger.ZERO)BigInteger.ONE

elsex.multiply(factorial(x.subtract(BigInteger.ONE)))

java.math.BigInteger:

scala.BigInt:

if (x == 0) 1 else x * factorial(x - 1)

Page 12: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scalable language means:

3. Extensible by growing new control constructs

Page 13: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

String s = "hi”;try {

s.charAt(-1);fail();

}catch (IndexOutOfBoundsException e) {

// Expected, so continue}

JUnit 3:

JUnit 4:

@Test(expected=IndexOutOfBoundsException.class)public void testPassingANegativeToCharAt() {

s.charAt(-1);}

Page 14: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

intercept(classOf[IndexOutOfBoundsException]) {s.charAt(-1)

}

ScalaTest:

Page 15: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

How Scala scales:

1. Scala is object-oriented

Page 16: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

1 + 2

(1).+(2)

“Pure” OO language:Every value is an object;

Every operation is a method call.

Page 17: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Domain-specific languages

if (x == 0) 1 else x * factorial(x - 1)

x - 1

x.-(1)

Page 18: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

But what about…

1 - x

Page 19: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Implicit conversions

int2BigInt (1).-(x)

1 - x

implicit def int2BigInt(i: Int): BigInt = new BigInt(i)

Page 20: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Why i: Int, not int i?

val i = 0noti = 0

val m: HashMap[String, (String, List[Char])] = …not

final HashMap<String, Pair<String, List<Char>>> m = …

1. Type inference:

2. Large type expressions:

Page 21: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala Traitstrait T {def abstractMeth(s: String): Intdef concreteMeth(s: String) = s + fieldvar field = "!"

}

interface Ex {int abstractMeth(String x);

}

(no concrete methods)(no fields)

Java Interfaces

Scala MixinComposition

class C extends Super with T

Java InterfaceImplementation

Class C extends Super implements Ex

Page 22: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala:

class Sample(x: Int, val p: Int) {def instMeth(y: Int) = x + y

}

object Sample {def mult(x: Int, y: Int) = x * y

}

class Sample {private final int x;public final int p;Sample(int x, int p) {

this.x = x;this.p = p;

}int instMeth(int y) {

return x + y;}static int staticMeth(int x, int y) {

return x * y;}

}

Java: Classes and

Objects

Sample.mult(1, 2)Invoked:

Page 23: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

How Scala scales:

2. Scala is functional

Page 24: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

int incr(int x) {return x + 1;

}

A Java method

Page 25: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

def incr(x: Int) = x + 1

A Scala function

Page 26: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

incr(x) = x + 1

A mathematical function

Page 27: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

def incr(x: Int) => x + 1

Anonymizing a function

Page 28: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

(x: Int) => x + 1

A function literal

Page 29: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

scala> val f = (x: Int) => x + 1f: (Int) => Int = <function>

scala> f(1)res0: Int = 2

Functions are first-class values

Page 30: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

f (1)

f.apply(1)

Functions are first-class values

Page 31: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Functional “attitude”

• Prefer immutable objects• Prefer “initialize-only” variables• Prefer methods with no side-effects

Page 32: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Immutable tradeoffs

• Simpler• Can pass them around• Inherently thread safe• Safest hashtable keys• Large graphs expensive to replicate

– So maybe offer a mutable alternative

Page 33: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Java String

String s = "immutable";String t = s.replace("im", "also im");System.out.println(s + ", " + t);

immutable, also immutable

Page 34: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Ruby String

irb(main):007:0> s = 'immutable'=> "immutable"irb(main):008:0> s['im'] = 'quite '=> ""irb(main):009:0> puts squite mutable

Page 35: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala String is Java String

val s = "immutable"val t = s.replace("im", "also im")println(s + ", " + t)

immutable, also immutable

Page 36: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Java List

import java.util.List;

List<String> mutable = new ArrayList<String>();

mutable.add("Hi");List<String> unmodifiable =

Collections.unmodifiableList(mutable);

Page 37: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala List

val myList = List("Hi" , "there")

Page 38: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala ListBuffer and Array

import scala.collection.mutable.ListBufferval muta = new ListBuffer[String]muta += "Hi"

val arr = Array("Hi")

Page 39: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala Set

val mySet = Set("Hi", "there")

Page 40: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala mutable.Set

import scala.collection.mutable.Setval muta = Set("Hi")

Page 41: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala's Set Hierarchy

Page 42: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Java variables

String s = "Hi";

final String t = "there";

Page 43: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala variables

val s = "Hi";

var t = "there";

Page 44: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Java idiom

String s = "default";if (args.length > 0) {

s = args[0];}

Page 45: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala with Java accent

var s = "default"if (args.length > 0) {

s = args(0)}

Page 46: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Scala idiom

val s =if (args.length > 0) args(0)else "default"

Page 47: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

gcdLoop

def gcdLoop(x: Long, y: Long): Long = {

var a = xvar b = y

while (a != 0) {val temp = a

a = b % ab = temp

}b

}

Page 48: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

gcd

def gcd(x: Long, y: Long): Long =

if (y == 0) x else gcd(y, x % y)

Page 49: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

How Scala scales:

3. Scala is statically typed

Page 50: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Type annotations in Java

Map<Integer, String> myMap =new HashMap<Integer, String>();

Page 51: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Type annotations in Scala

val hm = new HashMap[Int, String]()

val m: Map[Int, String] = new HashMap()

or

Page 52: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

javax.servlet.ServletRequest

public java.lang.StringgetParameter(java.lang.String name)

Returns the value of a request parameter as a String, or null if the parameter does not exist

Page 53: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Some(param) or None

Page 54: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

scala.List

def find (p: (A) => Boolean): Option[A]

Find and return the first element of the list satisfying a predicate, if any.

Page 55: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Using Optionval opt =

args.find(arg => { arg.substring(0, 2) == "-g" }

)

opt match {case Some(dashG) =>

println("Found: " + dashG)case None =>

println("No -g found")}

Page 56: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Getting Started with Scala

• Download Scala www.scala-lang.org• Get the eBook www.artima.com• Write scripts• Do a side project• "Mix in" Scala with Java

Page 57: A Scala Firehose - jaoo.dkjaoo.dk/dl/jaoo-aarhus-2008/slides/BillVenners_scalaFirehoseCompre… · A Scala Firehose Bill Venners President Artima, Inc. . Enough about me: • Run

Bill Venners

President

Artima, Inc.

www.artima.com

Q & A