You are on page 1of 66

Scala

. Scala

Epam Systems.

, 2011

. Scala



Scala

Scala
Scala?


Pattern matching

. Scala



Scala

. Scala



Scala

. Scala



Scala

?
,

.

. Scala



Scala

?
,

.
,


/

. Scala



Scala

Java
if ( i >0){
System.out.println("Hello my lovely Java");
}

. Scala



Scala

Java
if ( i >0){
System.out.println("Hello my lovely Java");
}

...
if (>(i() ,0) , callMethod(getMember(System(),"out"),"println","Hello my lovely Java"))

. Scala



Scala


,
Java

. Scala



Scala


,
Java
Java
- func(arg1,arg2,arg3),

. Scala



Scala


,
Java
Java
- func(arg1,arg2,arg3),

. Scala



Scala

?
= - ,

. Scala



Scala

?
= - ,


,
( )
.

. Scala



Scala

?
= - ,


,
( )
.
if - ?

. Scala



Scala

?
= - ,


,
( )
.
if - ?

, ?

. Scala



Scala

?
= - ,


,
( )
.
if - ?

, ?
. Lisp.

. Scala



Scala

environment ,
,
.


,
,


,
, ,
? ? Erlang
.

. Scala



Scala

. Scala



Scala

. Scala



Scala

Scala?


Pattern matching

Scala

Scala ,

.

. Scala



Scala

Scala?


Pattern matching

Scala

Scala ,

.
Scala SCAlable LAnguage.

. Scala



Scala

Scala?


Pattern matching

Scala

Scala ,

.
Scala SCAlable LAnguage.


- .
JVM .NET

. Scala



Scala

Scala?


Pattern matching

Hello Scala

Hello Scala syntax


package scala1
object Main { // class, but all members are static
def f (a: Int , b:Int) = a+b // public static int f ( int a, int b) {retrun a+b;}
def test (x: Float)={ // public static float test ( float x){
println (x+" wow") // System.out.println(x+"wow";
5 + x // return 5+x;
}
def main(args: Array[String]) { // public static void main(String args [])
var x = "Hello world" // String x = "Hello world" ;
x = "test" // x = "test";
val m: Int = 12 // final int m = 12;
}
}

. Scala



Scala

Scala?


Pattern matching

Hello Scala classes


Hello Java class
public class PersonJava {
private String name;
private int age;
public PersonJava(String fName, int fAge){
if (fAge<=0) throw new
IllegalArgumentException( "Person
should have age");
if ((fName==null) || (fName.isEmpty()))
throw new
IllegalArgumentException( "Person
should have name");
if (Character.isUpperCase
(fName.charAt(0))) throw new
IllegalArgumentException(
"Please, be polite");
name = fName;
age = fAge;
}
public PersonJava(int fAge){
this ("Unnamed of age "+fAge, fAge);
}
// OVER9000 getters/setters
}

. Scala



Scala

Scala?


Pattern matching

Hello Scala classes


Hello Java class
Hello Scala class
public class PersonJava {
private String name;
private int age;

import scala. reflect . BeanProperty

public PersonJava(String fName, int fAge){


if (fAge<=0) throw new
IllegalArgumentException( "Person
should have age");
if ((fName==null) || (fName.isEmpty()))
throw new
IllegalArgumentException( "Person
should have name");
if (Character.isUpperCase
(fName.charAt(0))) throw new
IllegalArgumentException(
"Please, be polite");
name = fName;
age = fAge;
}

class PersonScala(fName:String, fAge:Int){


require(fAge>0, "Person shoud have age");
require ((fName!=null) && (!fName.isEmpty),
"Person should have name")
require(fName(0).isUpper, "Be polite, please")
@BeanProperty
var name = fName
@BeanProperty
var age = fAge
def this (fAge:Int) = this("Unnamed of age
"+fAge, fAge)
}

public PersonJava(int fAge){


this ("Unnamed of age "+fAge, fAge);
}
// OVER9000 getters/setters
}

. Scala



Scala

Scala?


Pattern matching

Function types
Scala
def m(x:Int, y:Int) = x+y
val m1: (Int, Int)=>Int = m
val m2: (Int, Int)=>Int = {(x,y)=>x+y}
val m3: (Int, Int)=>Int = {_+_}
val m4 = {(x:Int, y:Int)=>x+y}
object m5{
def apply(x:Int , y:Int) = x+y
}
m5(1,2)
class m6{
def apply(x:Int , y:Int) = x+y
}
val m6Instance = new m6();
m6(2,3);

. Scala



Scala

Scala?


Pattern matching

Function types
Scala
def m(x:Int, y:Int) = x+y
val m1: (Int, Int)=>Int = m
val m2: (Int, Int)=>Int = {(x,y)=>x+y}
val m3: (Int, Int)=>Int = {_+_}
val m4 = {(x:Int, y:Int)=>x+y}
object m5{
def apply(x:Int , y:Int) = x+y
}
m5(1,2)
class m6{
def apply(x:Int , y:Int) = x+y
}
val m6Instance = new m6();
m6(2,3);

Scala

,

. Scala



Scala

Scala?


Pattern matching

Measure
val time = measure{
Thread.sleep(1000)
}
println (time)

. Scala



Scala

Scala?


Pattern matching

Measure
def measure(f: =>Unit):Long={
val time = System.currentTimeMillis
f
return System.currentTimeMillistime
}

Measure
val time = measure{
Thread.sleep(1000)
}
println (time)

. Scala



Scala

Scala?


Pattern matching

Measure
val time = measure{
Thread.sleep(1000)

Measure

}
println (time)

object measure{
def apply(f : =>Unit):Long={
val time = System.currentTimeMillis
f
return System.currentTimeMillistime
}
}

. Scala



Scala

Scala?


Pattern matching

Measure
measure.andLog{
Thread.sleep(1000)
}

. Scala



Scala

Scala?


Pattern matching

Measure
Measure
measure.andLog{
Thread.sleep(1000)

object measure{
def apply(f : =>Unit)={
val time = System.currentTimeMillis
f
System.currentTimeMillistime
}

def andLog(f: =>Unit){


val x = measure(f)
println ("taken: "+x)
}
}

. Scala



Scala

Scala?


Pattern matching

. Scala



Scala

Scala?


Pattern matching

if
unless(age<=0){
println ("Normal person")
}butif{
println ("Something strange")
}

. Scala



Scala

Scala?


Pattern matching

if
unless(age<=0){
println ("Normal person")
}butif{
println ("Something strange")
}

object unless{
def apply(b: Boolean)(f: =>Unit)={
if (! b){
f
}
return new butifHandler(b)
}
class butifHandler(b: Boolean){
def butif ( f : =>Unit){
if (b)
f
}
}
}

. Scala



Scala

Scala?


Pattern matching


Squeryl
transaction {
books.insert(new Author(1, "Michel","Folco"))
val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) // LINQ??? Nope =)
}

. Scala



Scala

Scala?


Pattern matching


Squeryl
transaction {
books.insert(new Author(1, "Michel","Folco"))
val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) // LINQ??? Nope =)
}

ScalaTest
describe("A Stack") {
it ("should pop values in last infirstout order") { pending }
it ("should throw NoSuchElementException if an empty stack is popped") {pending}
}

. Scala



Scala

Scala?


Pattern matching


Squeryl
transaction {
books.insert(new Author(1, "Michel","Folco"))
val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) // LINQ??? Nope =)
}

ScalaTest
describe("A Stack") {
it ("should pop values in last infirstout order") { pending }
it ("should throw NoSuchElementException if an empty stack is popped") {
val emptyStack = new Stack[Int]
intercept [ NoSuchElementException] {
emptyStack.pop()
}
}
}

. Scala



Scala

Scala?


Pattern matching


Squeryl
transaction {
books.insert(new Author(1, "Michel","Folco"))
val a = from(authors)(a=> where(a.lastName === "Folco") select(a)) // LINQ??? Nope =)
}

ScalaTest
describe("A Stack") {
it ("should pop values in last infirstout order") { pending }
it ("should throw NoSuchElementException if an empty stack is popped") {
val emptyStack = new Stack[Int]
intercept [ NoSuchElementException] {
emptyStack.pop()
}
}
}

Scala C#
using(new PrintWriter("sample.txt")){ out =>
out. println ("hellow world!")
}

. Scala



Scala

Scala?


Pattern matching

. Scala



Scala

Scala?


Pattern matching

?
- ,

. Scala



Scala

Scala?


Pattern matching

?
- ,

?

. Scala



Scala

Scala?


Pattern matching

?
- ,

?
, ,

. Scala



Scala

Scala?


Pattern matching

?
- ,

?
, ,

Scala ,

. Scala



Scala

Scala?


Pattern matching

Scala
Mutable

Java

Array Buffers

Java

List Buffers
Immutable

StringBuilders
Double Linked Lists

Lists

Mutable Lists

Streams

Queues

Vectors

Array Sequences

Immutable stacks

Stacks

Immutable Queues

Array Stacks

Ranges

Hash Tables

Hash Tries

Weak Hash Maps

Red-Black Trees

Concurrent Maps

Immutable BitSets

Mutable Bitsets

List Maps

. Scala



Scala

Scala?


Pattern matching

Stream
.
.
" "
Range
, ,

( ) for,
Range foreach
for
for ( i < 0 to 10 by 2){
println ( i )
}

. Scala



Scala

Scala?


Pattern matching

Weak Hash Map


Hash Map

Hash Trie

, 32 (
)

5 -

. Scala



Scala

Scala?


Pattern matching

. Scala



Scala

Scala?


Pattern matching

...
val tuple1 = (2,"test")
val tuple2 = 2>"test"
val array1 = Array(2,3,3,4)
val array2 = Array.ofDim[Int](3,3,3)
array2(2)(3)(2) = 9
var map
map +=
map =
map =

= Map("red">1,"green">2)
("blue">3 )
"oops"
"blue"

map += ("blue">(map.getOrElse("blue",0)+1)) // simple counter


var set = Set[Int ]()
set+=2
set = (23,3,5,5)
var list = List (2,3,4,2)
list = 2 :: list
list = list ::: list
list = list . tail
val maxValue = list.max
println (maxValue)

. Scala



Scala

Scala?


Pattern matching

?

,
.

. Scala



Scala

Scala?


Pattern matching

?

,
.

map
reduce,foldLeft/foldRight
filter
partition
forAll
groupBy
...

. Scala



Scala

Scala?


Pattern matching

map
,

. Scala



Scala

Scala?


Pattern matching

map
,

import scala.math._
// Returns new list, where all values are scaled
def scale (a: List [ Double], value:Double) = a.map(_value)
// Selects elements from list with given indicies
def selectItems [ T](data:List [ T], indicies : List [ Int ]) = indicies . map(data(_))
// Adds values of two lists together where they intersect by length
def addLists( list1 : List [ Int ], list2 : List [ Int ]) =
(0 until min(list1 . length, list2 . length)) . map({x=>list1(x)+list2(x)})

. Scala



Scala

Scala?


Pattern matching


foldLeft





. Scala



Scala

Scala?


Pattern matching


foldLeft





def
def
def
def
def

sum(seq: Seq[Int])= seq.foldLeft(0){(acc,x)=>acc+x}


max(seq: Seq[Int])= seq.foldLeft(0){(max,x)=>if (max>x) max else x}
multiply(seq: Seq[Int ]) = seq.foldLeft(1){(acc,x)=>accx}
factorial (n:Int) = multiply(1 to n)
seqToString(seq: Seq[Int ]) = seq.foldLeft("("){(acc,x)=>acc+x+","}+")"

def filter [ T](data:Seq[T])(predicate: T=>Boolean) =


data.reverse . foldLeft (List [ T]()){(acc,item)=>
if (predicate(item)) item :: acc else acc}
def toCSV[T](data:Seq[Seq[T]], printer: PrintStream){
data. foldLeft ( printer ){(printer , row)=>
printer . println (row.foldLeft(""){( line , item)=>line+item+";"}); printer
}
}

. Scala



Scala

Scala?


Pattern matching


filter
,

partition
,
forAll

groupBy
, , .
groupBy Map

. Scala



Scala

Scala?


Pattern matching



For comprehensions

, for comprehensions
for (item < (1 to 100)){
println (item)
}
val newList = for (item < list if (item%4>1)) yield 2item;


Range(1,100).foreach{
println (_)
}
val newList2 = list . filter (_%4>1).map(2_)

. Scala



Scala

Scala?


Pattern matching

. Scala



Scala

Scala?


Pattern matching

Pattern matching

Pattern matching
, switch-

item match {
case 2 => 4
case "hello" => 33
case x :: tail => x
case Point(x,y) => x+y
case _ => error("cannot process")
}

. Scala



Scala

Scala?


Pattern matching


val func = {item:Any=>
item match {
...
case Point(x,y) => x+y
...
}
}

. Scala



Scala

Scala?


Pattern matching


val func = {item:Any=>
item match {
...
case Point(x,y) => x+y
...
}
}

.
.

. Scala



Scala

Scala?


Pattern matching


val func = {item:Any=>
item match {
...
case Point(x,y) => x+y
...
}
}

.
.

object Point{
def unapply(p:Point):Option[(Int,Int) ] = Some(p.x,p.y)
}
class Point(fx : Int , fy : Int){
val x = fx
val y = fy
}

. Scala



Scala

Scala?


Pattern matching

Case class

,

. Scala



Scala

Scala?


Pattern matching

Case class

,


Scala " "

. Scala



Scala

Scala?


Pattern matching

Case class

,


Scala " "
Case class
: case class Point(x:Int, y:Int)
-
final
. var pt = Point(2,3)
hashCode equals
toString - Point(2,3)

. Scala



Scala


Scala (lazy, view)
Scala (, )
Scala (traits mixins)
Scala ( )
Scala ()

. Scala

You might also like