Use vals not vars
Is Object mutable?
- if the effect of your methods on the object depend on the history of the object -- what happened to the object before - then the object is mutable.
object HelloWorld {
// Casimirs second scala program
def main( args: Array[Strings] ) { // note: array definition is whitespace sensitive (no ws)
println( "Hello, Booty!" )
}
}
Scala: OO, Functional, Static
-> subclasses and mix-ins
-> anon and higher-order functions
-> function nesting and currying
Compiled with scalac
Executed with scala
Syntax
* Case Sensitive
* ClassNamesCamelCase
* methodNamesLowCamelCase
* filename same as object name
* identifiers
* keywords (including $) cannot be used as identifiers
* Operator identifiers ++, Mixed identifiers _+m , Literal identifiers ``
* multiline comment /** **/, single line comment //
* statements terminated by \n or ; -char
* package-declaration on first line: package com.liftcode.stuff
* import scala.xml._
* Java datatypes
* literals
Variables and values
var myVar : String = "Foo"
val aVal : String = "Bar" // immutable
val bVal : Int;
var nVar = 10; // type inference
val uVal = "Waa"; // type inference
* private, protected, public
* access mod scope: private[packagename]
Operators
* precedence
Loops, Conditionals
Functions
def functionName ([params]) : [return type] = {
// function body
return [expr]
}
* function that does not return anything has return-type Unit ( == void in java)
* function call:
functionName( param list )
// or
instance.functionName( param list )
Collections
* Lists, Sets, Maps, Tuples, Options, Iterators
Classes
class Point(xc: Int, yc: Int) {
var x: Int = xc
var y: Int = yc
def move(dx: Int, dy: Int) {
x = x + dx
y = y + dy
println ("Point x loc: " + x);
println ("Point y loc: " + y);
}
}
object Test {
def main(args: Array[String]) {
val pt = new Point(1,2);
pt.move(33, 22);
}
}
* override (param/method sig)
* extends (class)
* singleton objects with keyword -object
Traits - mixins
trait Equal {
def isEqual(x: Any) : Boolean
def isNotEqual(x: Any) : Boolean = !isEqual(x)
}
class Point with Equal {
// logic
}
Pattern matching
def matchTest(x: Int): String = x match {
case 1 => "yks"
case 2 => "kaks"
}
* regexes live in scala.util.matching.Regex -package
Exceptions
Extractors
* unapply
* apply
File I/O
* java.io.File
* val writer = new PrintWriter; writer.write(_str);
* scala.io.Source
* Source.fromFile("wat").foreach { print }
Sites
http://www.scala-lang.org/
http://www.scala-lang.org/api/current/index.html
http://www.tutorialspoint.com/scala/scala_quick_guide.htm
myMap.get(myKey) map (theValue => /* code to transform theValue */)
CSV file parsing
map
util for money, time
* Decimal rounding dollar to cent, time to 2 decimals
* hours between 18-06 +1.15/h
* overtime scala.collection.mutable.HashMap[0->1.25,2->1.5,4->2]
Output
"wages %m/%y"
"%ID, %NN, %SAL"