Introducción a Scala
Upcoming SlideShare
Loading in...5
×
 

Introducción a Scala

on

  • 2,364 views

Diapositivas de la charla introducción a Scala del JavaDay 2012 del Colombia JUG

Diapositivas de la charla introducción a Scala del JavaDay 2012 del Colombia JUG

Statistics

Views

Total Views
2,364
Views on SlideShare
1,295
Embed Views
1,069

Actions

Likes
0
Downloads
23
Comments
0

7 Embeds 1,069

http://neuronica.wordpress.com 933
http://www.aninki.net 84
http://www.scoop.it 46
http://translate.googleusercontent.com 2
http://cloud.feedly.com 2
http://www.google.com 1
https://neuronica.wordpress.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n

Introducción a Scala Introducción a Scala Presentation Transcript

  • Introducción a Scala Colombia JUG JavaDay 2012
  • Contenido• Introducción• Estructuras de control• Programación orientada a objetos• Programación funcional
  • Introducción
  • Mario Arias@dh44thttp://cobaltolabs.comhttp://neuronica.wordpress.com
  • ¿Que es Scala?Scala (Scalable Language).Scala es un lenguaje diseñado para la JVM,que combina los paradigmas de laprogramación orientada a objetos con laprogramación funcional
  • ¿Quien lo diseño?Martin Odersky (@odersky) en la EPFL.TypeSafe es la empresa que desarrolla y dasoporte a Scala y otras tecnologíasrelacionadas
  • Características• Orientado a objetos• Funcional• Escalable• Tipeado estático*• Extensible• Productivo• Open Sourcehttp://typesafe.com/technology/scala
  • Hola Mundo!object HelloWorld { def main(args: Array[String]) { println("Hello World") }}
  • Hola Mundo! (II)object HelloWorldApp extends App { println("Hello World")}
  • Hola Mundo! (III)println("Hello World")
  • REPL Read Evaluation Print LoopWelcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_04).Type in expressions to have them evaluated.Type :help for more information.scala> println("Hello World!")Hello World!
  • Estructuras de control
  • Sentencias y Expresiones• Sentencias son bloques de código que se ejecutan• Expresiones son bloques de código que se ejecutan y que retornan un valor
  • Variablesvar i:Int = 1var name:String = “Bonifacio”var age:Int = _
  • Variables (II)//Inferencia de tiposvar i = 1var name = “Bonifacio”var age = _ //Error
  • Variables (III)//JavaScriptvar i = 1;i = “Bonifacio”;//Scalavar i = 1i = “Bonifacio” //Error
  • Valores//Scalaval i:Int = 1val name:String = “Bonifacio”//Javafinal int i = 1;final String name = “Bonifacio”;
  • Valores (II)//inferencia de tiposval i = 1val name = “Bonifacio”
  • Métodosdef duplicar(i:Int):Int = { return i*2}
  • Métodos (II)def duplicar(i:Int) = { return i*2}
  • Métodos (III)def duplicar(i:Int) = { i*2}
  • Métodos (IV)def duplicar(i:Int) = i*2
  • Métodos (V)def imprimir(i:Int):Unit = { println(i*2)}
  • Métodos (V)def imprimir(i:Int){ println(i*2)}
  • Invocaciónduplicar(1)duplicar{1}duplicar{ val i = 5 val j = i - 3 j * i}
  • Invocación (II)multiplicar(2, 3)multiplicar{2, 3}// ErrortoString()toString
  • ifif (1 > 2) { println("Uno es mayor a dos")} else { println("Dos es mayor a uno")}
  • if (II)val resultado:String = if (1 > 2) { "Uno es mayor a dos"} else { "Dos es mayor a uno"}println(resultado)
  • matchdef desc(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case _ => "Otro"}
  • match (II)def desc2(n: String): Int = n match { case "Uno" => 1 case "Dos" => 2 case _ => -1}
  • match (III)def desc3(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case z => z + " ?"}
  • match (IV)def desc4(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case z if z % 2 == 0 => "Par" case _ => "Impar"}
  • match (V)def desc5(a: Any): String = a match { case i: Int => desc4(i) case i: String => i case i => i.toString}
  • whilevar i = 0while (i < 5) { println("i = " + i) i += 1}
  • do whilevar i = 0do { println("i = " + i) i += 1} while (i < 5)
  • forfor (i <- 0 to 9) { println("i = " + i)}for (i <- 0 until 9) { println("i = " + i)}
  • for (II)val langs = Array("Java", "Scala", "Python", "Groovy")for (lang <- langs) { println("lang = " + lang)}
  • for (III)for (lang <- langs if lang.size > 4) { println("lang = " + lang)}
  • for (IV)for { lang <- langs if lang.size > 4 upper = lang.toUpperCase} { println("lang = " + lang) println("upper = " + upper)}
  • for yieldval upperLanguages = for (lang <- langs) yield lang.toUpperCase
  • try catchtry{//operaciones peligrosas} catch{ case e:NumberFormatException => // case e:Exception => //}
  • Programación orientada a objetos
  • ¿Java es un lenguajeorientado a objetos puro?
  • NO
  • ¿Que es un lenguaje orientado a objetos puro?• Todo es un objeto• Todas las operaciones son métodos de dichos objetos
  • ¿Por qué Java no lo es?• Primitivos• Miembros estáticos• Operaciones matemáticas• y otras operaciones
  • Primitivos Java Scala byte Byte short Short int Int long Long char Char float Floatdouble Doubleboolean Boolean
  • Miembros Estaticos//Javapublic class Helper{ public static void metodo(){}}//Scalaobject Helper{ def metodo(){}}
  • Operaciones matemáticasval i = 2 + 3val j = 2.+(3)
  • instanceof//Javaif(i instanceof String) {//}//Scalaif(i.isInstanceOf[String]){//}
  • cast//Java(String)x((String)x).toUpperCase()//Scalax.asInstanceOf[String]x.asInstanceOf[String].toUpperCase
  • clasesclass Perro{ var nombre:String = _ def hablar(){ println(nombre + “ dice: Gua”) }}
  • modificadores de alcance Java Scala public “por defecto” protected protected private private“por defecto” private[paquete] N.D. private[this]
  • constructorclass Perro(val nombre:String) { println("Acaba de nacer el perrito " + nombre)}
  • constructor (II)class Perro(val nombre:String) { println("Acaba de nacer el perrito " + nombre) def this() = this(“Sin nombre”)}
  • traittrait Cuadrupedo{ def caminar()}class Perro extends Cuadrupedo { def caminar(){ println(“Caminando...”) }}
  • trait (II)trait Cuadrupedo{ def caminar(){ println(“Caminando...”) }}class Perro extends Cuadrupedo {}
  • trait (III)class Perro extends Cuadrupedo with Mamifero {}class Gato extends Cuadrupedo with Mamifero {}class Tortuga extends Cuadrupedo with Reptil {}
  • trait (IV)trait UserServiceAware{ @Inject var userService:UserService = _}class UserController extends UserServiceAware{}class UserEndPoint extends UserServiceAware{}
  • trait (V)val robot = new Robot with Cuadrupedorobot.caminar()
  • duck typingSi camina como pato y nada como pato es un pato
  • duck typing (II)#Pythonclass Perro: def hablar(self): print "Gua"class Persona: def hablar(self): print "Hola"
  • duck typing (III)#Pythondef hacer_hablar(hablador): hablador.hablar()hacer_hablar(Perro())hacer_hablar(Persona())hacer_hablar(1) #Error de ejecución
  • Tipos estructuralesclass Perro{ def hablar(){println(“Guau”)}}class Persona{ def hablar(){println(“Hola”)}}
  • Tipos estructurales(II) def hacerHablar(hablador:{def hablar()}){ hablador.hablar() } hacerHablar(new Perro) hacerHablar(new Persona) hacerhablar(1) //Error de compilación
  • Tipos estructurales(III)def isHablarDefinido(x:Any):Boolean = { x.isInstanceOf[{def hablar()}]}
  • applyval langs = Array("Java", "Scala", "Python", "Groovy")langs(0)langs.apply(0)
  • Genéricostrait Listener[T]{ def action(event:T)}
  • Genéricos (II)trait Listener[T <: MiClase]{ def action(event:T)}
  • Funciones implícitas Funciones implícitas son funciones que usan paraconvertir de un tipo a otro en forma transparente
  • Funciones implícitas (II)println("Desde el segundo JavaDay".andTheMusic())
  • Funciones implícitas (III)class CarolinaCruzLike(val s: String) { def andTheMusic(): String = { s + " and the music" }}
  • Funciones implícitas (IV)implicit def stringToCaroCruz(s: String) = { new CarolinaCruzLike(s)}
  • Funciones implícitas (V)println("Desde el segundo JavaDay".andTheMusic())println{ stringToCaroCruz("Desde el segundo JavaDay") .andTheMusic()}
  • Programación Funcional
  • ¿Que es?Programación funcional es un paradigma deprogramación que trata todo operación como unaevaluación de una función aritmética y tiene sus raícesen el calculo lambda
  • Funciónval duplicar = {i: Int => i * 2}val duplicar: (Int) => Int ={i => i * 2}duplicar(2)
  • Composiciónval duplicar = {i: Int => i * 2}val mas5 = {i: Int => i + 5}val duplicarMas5 = duplicar andThen mas5duplicarMas5(2)val mas5duplicar = duplicar compose mas5mas5duplicar(2)
  • Coleccionesval numeros = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)numeros.foreach((i: Int) => { println("i = " + i)})numeros.foreach(i => println("i = " + i))
  • Colecciones (II)//JavaList<String> langs = Arrays.asList("Java", "Scala", "Python", "Groovy");List<String> upperLangs = new ArrayList<String>();for (String lang : langs) { upperLangs.add(lang.toUpperCase());}
  • Colecciones (III)val langs = List("Java", "Scala", "Python", "Groovy")val upperLangs = langs.map(lang => lang.toUpperCase)
  • Colecciones (IV)Método Descripción Ejecuta una función en todos losforeach elementos Colección nueva aplicando una map función a todos los elementos Colección nueva con todos los filter elementos que cumplen una función T => Boolean Colección nueva con todos losfilterNot elementos que no cumplen una función T => Boolean
  • Colecciones (V)Método Descripción Valida que todos los elementos forall cumplen una función T => Boolean Valida que al menos un elemento exists cumpla una función T => Boolean Retorna cuantos elementos cumplen count una función T => Boolean
  • Función como parámetrodef operar(f: (Int, Int) => Int): Int = { f(5, 8)}operar((a, b) => {a + b})operar((a, b) => {a * b})
  • Bloque como parámetrodef cronometrar(block: => Unit) { val start = System.currentTimeMillis() block println(System.currentTimeMillis() - start)}cronometrar{ unMetodoMuyDemorado()}
  • ¿Como quedaron? or