Introducción a Scala

  • 2,219 views
Uploaded on

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
2,219
On Slideshare
0
From Embeds
0
Number of Embeds
9

Actions

Shares
Downloads
25
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    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

Transcript

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