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 laprograma...
¿Quien lo diseño?Martin Odersky (@odersky) en la EPFL.TypeSafe es la empresa que desarrolla y dasoporte a Scala y otras te...
Características•   Orientado a objetos•   Funcional•   Escalable•   Tipeado estático*•   Extensible•   Productivo•   Open ...
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 ...
Estructuras de control
Sentencias y         Expresiones• Sentencias son bloques de código que se  ejecutan• Expresiones son bloques de código que...
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"    ...
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)      ...
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 ob...
¿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      Floatdoub...
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  ...
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(“S...
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 exte...
trait (IV)trait UserServiceAware{    @Inject var userService:UserService = _}class UserController 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):          ...
duck typing (III)#Pythondef hacer_hablar(hablador):    hablador.hablar()hacer_hablar(Perro())hacer_hablar(Persona())hacer_...
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) hacerHabl...
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 mu...
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 Ja...
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 a...
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 mas5duplicarMas...
Coleccionesval numeros = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)numeros.foreach((i: Int) => { println("i = " + i)})numeros.foreac...
Colecciones (II)//JavaList<String> langs = Arrays.asList("Java", "Scala", "Python", "Groovy");List<String> upperLangs = ne...
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                       ...
Colecciones (V)Método              Descripción            Valida que todos los elementos forall          cumplen una funci...
Función como                parámetrodef operar(f: (Int, Int) => Int): Int = {    f(5, 8)}operar((a, b) => {a + b})operar(...
Bloque como                 parámetrodef cronometrar(block: => Unit) {    val start = System.currentTimeMillis()    block ...
¿Como quedaron?       or
Introducción a Scala
Upcoming SlideShare
Loading in...5
×

Introducción a Scala

2,467

Published on

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

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
2,467
On Slideshare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
26
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide
  • \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

    1. 1. Introducción a Scala Colombia JUG JavaDay 2012
    2. 2. Contenido• Introducción• Estructuras de control• Programación orientada a objetos• Programación funcional
    3. 3. Introducción
    4. 4. Mario Arias@dh44thttp://cobaltolabs.comhttp://neuronica.wordpress.com
    5. 5. ¿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
    6. 6. ¿Quien lo diseño?Martin Odersky (@odersky) en la EPFL.TypeSafe es la empresa que desarrolla y dasoporte a Scala y otras tecnologíasrelacionadas
    7. 7. Características• Orientado a objetos• Funcional• Escalable• Tipeado estático*• Extensible• Productivo• Open Sourcehttp://typesafe.com/technology/scala
    8. 8. Hola Mundo!object HelloWorld { def main(args: Array[String]) { println("Hello World") }}
    9. 9. Hola Mundo! (II)object HelloWorldApp extends App { println("Hello World")}
    10. 10. Hola Mundo! (III)println("Hello World")
    11. 11. 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!
    12. 12. Estructuras de control
    13. 13. 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
    14. 14. Variablesvar i:Int = 1var name:String = “Bonifacio”var age:Int = _
    15. 15. Variables (II)//Inferencia de tiposvar i = 1var name = “Bonifacio”var age = _ //Error
    16. 16. Variables (III)//JavaScriptvar i = 1;i = “Bonifacio”;//Scalavar i = 1i = “Bonifacio” //Error
    17. 17. Valores//Scalaval i:Int = 1val name:String = “Bonifacio”//Javafinal int i = 1;final String name = “Bonifacio”;
    18. 18. Valores (II)//inferencia de tiposval i = 1val name = “Bonifacio”
    19. 19. Métodosdef duplicar(i:Int):Int = { return i*2}
    20. 20. Métodos (II)def duplicar(i:Int) = { return i*2}
    21. 21. Métodos (III)def duplicar(i:Int) = { i*2}
    22. 22. Métodos (IV)def duplicar(i:Int) = i*2
    23. 23. Métodos (V)def imprimir(i:Int):Unit = { println(i*2)}
    24. 24. Métodos (V)def imprimir(i:Int){ println(i*2)}
    25. 25. Invocaciónduplicar(1)duplicar{1}duplicar{ val i = 5 val j = i - 3 j * i}
    26. 26. Invocación (II)multiplicar(2, 3)multiplicar{2, 3}// ErrortoString()toString
    27. 27. ifif (1 > 2) { println("Uno es mayor a dos")} else { println("Dos es mayor a uno")}
    28. 28. if (II)val resultado:String = if (1 > 2) { "Uno es mayor a dos"} else { "Dos es mayor a uno"}println(resultado)
    29. 29. matchdef desc(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case _ => "Otro"}
    30. 30. match (II)def desc2(n: String): Int = n match { case "Uno" => 1 case "Dos" => 2 case _ => -1}
    31. 31. match (III)def desc3(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case z => z + " ?"}
    32. 32. match (IV)def desc4(i: Int): String = i match { case 1 => "Uno" case 2 => "Dos" case z if z % 2 == 0 => "Par" case _ => "Impar"}
    33. 33. match (V)def desc5(a: Any): String = a match { case i: Int => desc4(i) case i: String => i case i => i.toString}
    34. 34. whilevar i = 0while (i < 5) { println("i = " + i) i += 1}
    35. 35. do whilevar i = 0do { println("i = " + i) i += 1} while (i < 5)
    36. 36. forfor (i <- 0 to 9) { println("i = " + i)}for (i <- 0 until 9) { println("i = " + i)}
    37. 37. for (II)val langs = Array("Java", "Scala", "Python", "Groovy")for (lang <- langs) { println("lang = " + lang)}
    38. 38. for (III)for (lang <- langs if lang.size > 4) { println("lang = " + lang)}
    39. 39. for (IV)for { lang <- langs if lang.size > 4 upper = lang.toUpperCase} { println("lang = " + lang) println("upper = " + upper)}
    40. 40. for yieldval upperLanguages = for (lang <- langs) yield lang.toUpperCase
    41. 41. try catchtry{//operaciones peligrosas} catch{ case e:NumberFormatException => // case e:Exception => //}
    42. 42. Programación orientada a objetos
    43. 43. ¿Java es un lenguajeorientado a objetos puro?
    44. 44. NO
    45. 45. ¿Que es un lenguaje orientado a objetos puro?• Todo es un objeto• Todas las operaciones son métodos de dichos objetos
    46. 46. ¿Por qué Java no lo es?• Primitivos• Miembros estáticos• Operaciones matemáticas• y otras operaciones
    47. 47. Primitivos Java Scala byte Byte short Short int Int long Long char Char float Floatdouble Doubleboolean Boolean
    48. 48. Miembros Estaticos//Javapublic class Helper{ public static void metodo(){}}//Scalaobject Helper{ def metodo(){}}
    49. 49. Operaciones matemáticasval i = 2 + 3val j = 2.+(3)
    50. 50. instanceof//Javaif(i instanceof String) {//}//Scalaif(i.isInstanceOf[String]){//}
    51. 51. cast//Java(String)x((String)x).toUpperCase()//Scalax.asInstanceOf[String]x.asInstanceOf[String].toUpperCase
    52. 52. clasesclass Perro{ var nombre:String = _ def hablar(){ println(nombre + “ dice: Gua”) }}
    53. 53. modificadores de alcance Java Scala public “por defecto” protected protected private private“por defecto” private[paquete] N.D. private[this]
    54. 54. constructorclass Perro(val nombre:String) { println("Acaba de nacer el perrito " + nombre)}
    55. 55. constructor (II)class Perro(val nombre:String) { println("Acaba de nacer el perrito " + nombre) def this() = this(“Sin nombre”)}
    56. 56. traittrait Cuadrupedo{ def caminar()}class Perro extends Cuadrupedo { def caminar(){ println(“Caminando...”) }}
    57. 57. trait (II)trait Cuadrupedo{ def caminar(){ println(“Caminando...”) }}class Perro extends Cuadrupedo {}
    58. 58. trait (III)class Perro extends Cuadrupedo with Mamifero {}class Gato extends Cuadrupedo with Mamifero {}class Tortuga extends Cuadrupedo with Reptil {}
    59. 59. trait (IV)trait UserServiceAware{ @Inject var userService:UserService = _}class UserController extends UserServiceAware{}class UserEndPoint extends UserServiceAware{}
    60. 60. trait (V)val robot = new Robot with Cuadrupedorobot.caminar()
    61. 61. duck typingSi camina como pato y nada como pato es un pato
    62. 62. duck typing (II)#Pythonclass Perro: def hablar(self): print "Gua"class Persona: def hablar(self): print "Hola"
    63. 63. duck typing (III)#Pythondef hacer_hablar(hablador): hablador.hablar()hacer_hablar(Perro())hacer_hablar(Persona())hacer_hablar(1) #Error de ejecución
    64. 64. Tipos estructuralesclass Perro{ def hablar(){println(“Guau”)}}class Persona{ def hablar(){println(“Hola”)}}
    65. 65. Tipos estructurales(II) def hacerHablar(hablador:{def hablar()}){ hablador.hablar() } hacerHablar(new Perro) hacerHablar(new Persona) hacerhablar(1) //Error de compilación
    66. 66. Tipos estructurales(III)def isHablarDefinido(x:Any):Boolean = { x.isInstanceOf[{def hablar()}]}
    67. 67. applyval langs = Array("Java", "Scala", "Python", "Groovy")langs(0)langs.apply(0)
    68. 68. Genéricostrait Listener[T]{ def action(event:T)}
    69. 69. Genéricos (II)trait Listener[T <: MiClase]{ def action(event:T)}
    70. 70. Funciones implícitas Funciones implícitas son funciones que usan paraconvertir de un tipo a otro en forma transparente
    71. 71. Funciones implícitas (II)println("Desde el segundo JavaDay".andTheMusic())
    72. 72. Funciones implícitas (III)class CarolinaCruzLike(val s: String) { def andTheMusic(): String = { s + " and the music" }}
    73. 73. Funciones implícitas (IV)implicit def stringToCaroCruz(s: String) = { new CarolinaCruzLike(s)}
    74. 74. Funciones implícitas (V)println("Desde el segundo JavaDay".andTheMusic())println{ stringToCaroCruz("Desde el segundo JavaDay") .andTheMusic()}
    75. 75. Programación Funcional
    76. 76. ¿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
    77. 77. Funciónval duplicar = {i: Int => i * 2}val duplicar: (Int) => Int ={i => i * 2}duplicar(2)
    78. 78. 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)
    79. 79. 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))
    80. 80. 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());}
    81. 81. Colecciones (III)val langs = List("Java", "Scala", "Python", "Groovy")val upperLangs = langs.map(lang => lang.toUpperCase)
    82. 82. 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
    83. 83. 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
    84. 84. Función como parámetrodef operar(f: (Int, Int) => Int): Int = { f(5, 8)}operar((a, b) => {a + b})operar((a, b) => {a * b})
    85. 85. Bloque como parámetrodef cronometrar(block: => Unit) { val start = System.currentTimeMillis() block println(System.currentTimeMillis() - start)}cronometrar{ unMetodoMuyDemorado()}
    86. 86. ¿Como quedaron? or
    1. A particular slide catching your eye?

      Clipping is a handy way to collect important slides you want to go back to later.

    ×