Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Introducción a Scala

3,086 views

Published on

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

  • Be the first to comment

  • Be the first to like this

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

×