SlideShare una empresa de Scribd logo
Kotlin
Programming
Language
CONSTRUCCIÓN DE
INTERFACES DE USUARIO
1er Cuatrimestre de 2019
Hello World
2
class Greeter(val name: String) {
fun greet() {
println("Hola $name")
}
}
fun main(args: Array<String>) {
Greeter(args[0]).greet()
}
package ar.edu.unq.ui.greeting;
public class Greeter {
private String name;
public Greeter(String name) {
this.name = name;
}
public void greet() {
System.out.println("Hello " + name);
}
public static void main(String[] args)
{
new Greeter(args[0]).greet();
}
}
◎ Package opcional
◎ Entry point como función
(no necesita estar en una clase)
◎ Los ; son opcionales
◎ Scope public por default
◎ Constructor primario en la
declaración
Consideraciones
◎ Esta clase es una presentación de Kotlin.
◎ No es una guía exhaustiva.
◎ Todo nuevo lenguaje se aprende codeando.
◎ Cuando surjan dudas primero vayan a
https://kotlinlang.org/docs/reference/
◎ También tienen guías nativas en
https://play.kotlinlang.org/koans/
◎ Y tienen las Prácticas y los TPs para codear.
3
Acerca de Kotlin
◎ Lenguaje de Propósito General
◎ Multi Plataforma
◎ Tipado Estático
◎ Inferencia de Tipos
4
◎ Puede compilar a
○ JVM (por ahora solo
nos importa este)
○ Android
○ Javascript
○ Assembler Nativo
◉ iOS
◉ MacOS
◉ Windows
◉ Linux
◉ WebAssembly
◎ Desarrollado por JetBrains
◎ El nombre fue dado por la Isla
de Kotlin, cerca de San
Petersburgo (Rusia)
◎ Vamos a usar la versión 1.3
Funciones
5
fun printMessage(message: String): Unit {
println(message)
}
fun printMessageWithPrefix(message: String, prefix: String = "Info") {
println("[$prefix] ${message}")
}
fun sum(x: Int, y: Int): Int {
return x + y
}
fun multiply(x: Int, y: Int) = x * y
fun main() {
printMessage("Hello")
printMessageWithPrefix("Hello", "Log")
printMessageWithPrefix("Hello")
printMessageWithPrefix(prefix = "Log", message = "Hello")
println(sum(1, 2))
}
Variables
6
// Variable mutable tipada e inicializada
var a: String = "initial"
// Variable inmutable tipada e inicializada
val b: Int = 1
// Variable inmutable inicializada con inferencia de tipo
val c = 3
// Variable mutable declarada con tipo sin inicializar
var d: Int
// Variable inmutable declarada con tipo sin inicializar
val e: Int
// No se rompe la inmutabilidad con la asignación condicional
if (someCondition()) { e = 1 } else { e = 2 }
Null Safety
7
var neverNull: String = "Esta variable no puede ser null"
neverNull = null // Compilation Error
var nullable: String? = "Esta variable puede ser null"
nullable = null // Todo bien
var inferredNonNull = "La inferencia de tipo no permite nullable"
inferredNonNull = null // Compilation Error
// Argumento no nullable
fun strLength(strNotNull: String): Int = strNotNull.length
strLength(neverNull) // Todo bien
strLength(nullable) // Compilation Error
// Argumento nullable
fun describeString(maybeString: String?): String {
if (maybeString != null) { return "Caracteres = ${maybeString.length}" }
else { return "Eso no es un string, es null" }
}
// Argumento y resultado nullable
fun strLengthNulleable(maybeString: String?): Int? = strNotNull?.length
Clases (I)
8
// Si se declara una clase "vacía", se pueden omitir las llaves
class Customer
// El header puede contener las propiedades
// y funciona como constructor
class Contact(val id: Int, var email: String)
fun main() {
val customer = Customer() // No se necesita new, sí los ()
val contact = Contact(1, "mary@gmail.com")
// Accessors automáticos
println(contact.id)
contact.email = "jane@gmail.com"
}
Clases (II): Herencia
9
class FinalDog // Por defecto las clases son final
class Bulldog : FinalDog // Error de compilación, Dog es final
// Para que pueda ser heredada hay que marcarla como open
open class Dog {
// Lo mismo para los métodos, por defecto no se pueden sobreescribir
open fun sayHello() = println("wof wof!")
fun finalHello() = println("soy irremplazable")
}
class Yorkshire : Dog() {
override fun sayHello() = println("wif wif!")
// Error de compilación
override fun finalHello() = println("soy irremplazable")
}
fun main() {
val dog: Dog = Yorkshire()
dog.sayHello() // Output: wif wif!
}
Uso del Condicional (if)
10
var max = a
// Uso tradicional
if (a < b) {
max = b
}
if (a > b) {
max = a
} else {
max = b
}
◎ En Kotlin if no es una estructura de control sino una expresión.
◎ Con lo cual siempre retorna un valor.
// Uso como expresión
val max = if (a > b) a else b
// Si se utilizan bloques,
// el valor del bloque
// es la última expresión
val max = if (a > b) {
print("a es mayor")
a
} else {
print("b es mayor")
b
}
val blue = "Blue"
val sameBlue = "Blue"
println(blue == sameBlue) // true
println(blue === sameBlue) // true, son la misma referencia
val numbers = setOf(1, 2, 3)
val sameNumbers = setOf(2, 1, 3)
println(numbers == sameNumbers) // true, son conjuntos iguales
println(numbers === sameNumbers) // false, son distintas referencias
val bart = User("Bart")
val bort = User("Bart")
println(bart == bort) // true, se llaman igual
println(bart === bort) // false, son distintas instancias
Igualdad
11
◎ = asignación
◎ == comparación estructural
◎ === comparación referencial
class User(val name: String) {
override fun equals(other: Any?): Boolean =
other is User && other.name == this.name
override fun hashCode(): Int =
name.hashCode()
}
Loops (for, while, do while)
12
val cakes = listOf(
"frutilla",
"merengue",
"chocolate"
)
// Se puede iterar directamente
// sobre los elementos
for (cake in cakes) {
println("Torta de $cake")
}
// Y también sobre los índices
for (i in array.indices) {
println(array[i])
}
◎ Funcionan de manera similar a otros lenguajes
var cakesEaten = 0
while (cakesEaten < 5) {
eatACake()
cakesEaten++
}
var cakesBaked = 0
do {
bakeACake()
cakesBaked++
} while (cakesBaked < 5)
Rangos
13
// Rango ascendente
for(i in 0..3) print(i)
// 0 1 2 3
// Rango ascendente con salto
for(i in 2..8 step 2) print(i)
// 2 4 6 8
// Rango descendente
for (i in 3 downTo 0) print(i)
// 3 2 1 0
// Rango descendente con salto
for (i in 9 downTo 0 step 3)
print(i)
// 9 6 3 0
// Rango ascendente de caracteres
for (c in 'a'..'d') print(c)
// a b c d
// Rango desc. de caract. con salto
for (c in 'z' downTo 's' step 2)
print(c)
// z x v t
// Se puede evaluar pertenencia
val x = 2
val inRange =
if (x in 1..10) print(x)
// true, 2
if (x !in 1..4) print(x)
// false
Clases Especiales (I): Data Classes
14
// Las Data Classes son ideales para almacenar información
// Definen automáticamente métodos como:
// equals(), copy(), hashCode(), toString()
data class User(val name: String, val id: Int)
fun main() {
val user = User("Alex", 1)
println(user) // User(name=Alex, id=1)
val secondUser = User("Alex", 1)
val thirdUser = User("Max", 2)
println(user == secondUser) // true
println(user == thirdUser) // false
// copy() genera una nueva instancia con las mismas propiedades
println(user.copy()) // User(name=Alex, id=1)
// Pero se pueden sobreescribir las propiedades deseadas
println(user.copy("Max")) // User(name=Max, id=1)
println(user.copy(id = 2)) // User(name=Alex, id=2)
}
Clases Especiales (II): Object
15
// Singleton of Prices
object Prices {
var standard: Int = 30
var holiday: Int = 50
var special: Int = 100
fun average() = sumAll() / 3
private fun sumAll() =
standard + holiday + special
}
fun main() {
println(Prices.standard) // 30
println(Prices.average()) // 60
}
◎ Un Object se puede pensar como la única instancia de una Clase
◎ Es en definitiva una aplicación del patrón Singleton
fun main() {
// Se puede utilizar como una expresión
// con propiedades y comportamiento
val unique = object {
var unique: Int = 42
fun average() =
(Prices.average() + unique) / 2
}
println(unique.average()) // 51
// Se le puede cambiar el estado
// (porque es una instancia ;)
unique.unique = 0
println(unique.average()) // 30
}
Colecciones (I): Listas & Conjuntos
16
val roots: List<String> = listOf("root", "groot")
val sudoers: MutableList<String> =
mutableListOf("tony", "steve", "bruce")
val planets: Set<String> = // Inmutable Set
setOf("tierra", "titan", "titan", "asgard", "tierra")
fun main() {
roots.add("fury") // <- Compilation Error
sudoers.add("carol")
println("${roots.size}") // 2
for (root in roots) println(root) // root, groot
sudoers.forEach { e -> println(e) } // tony, steve, bruce, carol
planets.forEach { println(it) } // tierra, titan, asgard
}
◎ Una list es una colección ordenada de elementos.
◎ Puede ser mutable o inmutable.
◎ Un set es una lista sin repetidos.
Colecciones (II): Maps
17
val codes: Map<Int, String> = mapOf(1 to "Intro", 2 to "Orga", 3 to "Mate1")
val approved: MutableMap<String, Int> =
mutableMapOf("Intro" to 10, "Orga" to 8, "Obj1" to 9)
fun approved(code: Int) = approved.containsKey(codes[code])
fun score(name: String): Int? =
if (approved.containsKey(name)) approved.getValue(name) else null
fun main() {
println(approved(1)) // true
println(approved(3)) // false
println(score("Intro")) // 10
println(score("UI")) // null
approved.forEach { key, value -> println("$key: $value") }
// Intro: 10, Orga: 8, Obj1: 9
codes.forEach { println("${it.key}: ${it.value}") }
// 1: Intro, 2: Orga, 3: Mate1
}
◎ Un map es una colección clave/valor. Puede ser mutable o inmutable.
18
Operaciones con Colecciones
val list = listOf(1, 2, 3)
Filter list.filter { it > 2 } // [3]
Map list.map { it * 2 } // [2, 4, 6]
Any, All, None list.any { it == 2 } // true
Find, FindLast list.find { it > 3 } // null
First, Last list.first() // 1
Count list.count { it > 1 } // 2
Min, Max list.max() // 3
Sorted list.sortedBy { -it } // [3, 2, 1]
Get or Else list.getOrElse(7) { 42 } // 42
Uff...
19
◎ Hasta acá un pantallazo de cómo se puede
programar en Kotlin
◎ Tienen mucho más para investigar
◎ ¿Vemos un ejemplo en PC?

Más contenido relacionado

DOCX
Cesar lenguaje c_
KEY
Javascript funcional
PDF
Java Applet:::Pelota que rebota en un recinto.
PDF
Interpolaion c++
PDF
Descubriendo scala
DOC
Acmar trucos de visual basic(2)
PDF
Semana 4 Estructuras de datos(Tuplas, Conjuntos y Diccionarios)
PDF
DescripcióN De Codigo Y Interfaz
Cesar lenguaje c_
Javascript funcional
Java Applet:::Pelota que rebota en un recinto.
Interpolaion c++
Descubriendo scala
Acmar trucos de visual basic(2)
Semana 4 Estructuras de datos(Tuplas, Conjuntos y Diccionarios)
DescripcióN De Codigo Y Interfaz

La actualidad más candente (19)

PDF
Sudoku
PDF
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
PDF
Ejercicios de programacion concurrente
DOCX
Hechos en clase
PDF
Ejercicios python
PDF
Tipos basicos de java
DOCX
Programas en netbeans
TXT
Metodos de ordenamiento
PDF
Charla congreso web introducción programación funcional en JavaScript
PPTX
Video 1 metodos y arreglos
PDF
Por qué Cervantes programaba mejor que tú
PDF
Python3000
DOCX
Codigo en visual basic
DOCX
Ejercicios java
PDF
C Funciones
PPT
Python03
PPT
Lección No. 1 de Python
PDF
Semana 4 Estructuras de datos(Listas)
PDF
Semana 6 Módulos en Python Entrega 1
Sudoku
Semana 2 Fundamentos de Python(Entradas, Salidas y Operaciones Aritméticas)
Ejercicios de programacion concurrente
Hechos en clase
Ejercicios python
Tipos basicos de java
Programas en netbeans
Metodos de ordenamiento
Charla congreso web introducción programación funcional en JavaScript
Video 1 metodos y arreglos
Por qué Cervantes programaba mejor que tú
Python3000
Codigo en visual basic
Ejercicios java
C Funciones
Python03
Lección No. 1 de Python
Semana 4 Estructuras de datos(Listas)
Semana 6 Módulos en Python Entrega 1
Publicidad

Similar a 1.2. kotlin (1) (20)

PPTX
kotlin_25 programacion en Android p.pptx
PDF
Kotlin es
KEY
Introducción a Scala
PPTX
Introducción a Scala
PDF
Introducción a Kotlin para desarrolladores Java
PPTX
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
PDF
Programacion moviles KOTKIN-POO-2020.pdf
PDF
Apache spark meetup
PDF
Procesamiento de datos a gran escala con Apache Spark
PPTX
4 Introducción al lenguaje Scala
PDF
380914324 poo-kotlin
PDF
Programación orientada a objetos-Kotlin.pptx.pdf
PPTX
Fundamentos de Scala (Scala Basics) (español) Catecbol
DOC
Java clases dictadas
PDF
Mobile Day - Kotlin
DOCX
TutorialKotlin.docx
PDF
Clase6 collections
PDF
Introducción a Swift
PDF
Scala: un vistazo general
PPTX
Portafolio
kotlin_25 programacion en Android p.pptx
Kotlin es
Introducción a Scala
Introducción a Scala
Introducción a Kotlin para desarrolladores Java
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
Programacion moviles KOTKIN-POO-2020.pdf
Apache spark meetup
Procesamiento de datos a gran escala con Apache Spark
4 Introducción al lenguaje Scala
380914324 poo-kotlin
Programación orientada a objetos-Kotlin.pptx.pdf
Fundamentos de Scala (Scala Basics) (español) Catecbol
Java clases dictadas
Mobile Day - Kotlin
TutorialKotlin.docx
Clase6 collections
Introducción a Swift
Scala: un vistazo general
Portafolio
Publicidad

Más de xavazque2 (20)

PDF
258939538 dumping
PDF
146817358 android
PDF
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
PDF
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
PDF
325940441 motion-ui
PDF
371081023 curso-desarrollo-android
PDF
4.1. validaciones-y-excepciones
PDF
3.1 mvc-mvvm-app model-binding
PDF
5.1. stateles stateful-protocolo_http
PDF
435338801 programacion-mobile-android
PDF
457126889 android-pdf
PDF
266521557 apuntes-unidad-formativa-app-inventor
PDF
7. react js-1
PDF
PDF
484719815 pidiendo-ayuda-a-los-angeles-pdf
PDF
484717855 transmutacion-de-energias-pdf
PDF
5.layouts
PDF
6.2. js
PDF
2.1. arena-y-binding
PDF
411958729 curso-de-delphi-pdf
258939538 dumping
146817358 android
Curso profesional-de-desarrollo-de-aplicaciones-android-con-kotlin
364196144 hogan-pensamiento-no-verbal-comunicacion-y-juego
325940441 motion-ui
371081023 curso-desarrollo-android
4.1. validaciones-y-excepciones
3.1 mvc-mvvm-app model-binding
5.1. stateles stateful-protocolo_http
435338801 programacion-mobile-android
457126889 android-pdf
266521557 apuntes-unidad-formativa-app-inventor
7. react js-1
484719815 pidiendo-ayuda-a-los-angeles-pdf
484717855 transmutacion-de-energias-pdf
5.layouts
6.2. js
2.1. arena-y-binding
411958729 curso-de-delphi-pdf

Último (20)

PPTX
Propuesta BKP servidores con Acronis1.pptx
PDF
CyberOps Associate - Cisco Networking Academy
PDF
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
PPTX
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
PDF
Estrategia de apoyo tecnología miguel angel solis
PDF
Plantilla para Diseño de Narrativas Transmedia.pdf
PPTX
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
PPT
Que son las redes de computadores y sus partes
PPTX
Presentación PASANTIAS AuditorioOO..pptx
PPTX
REDES INFORMATICAS REDES INFORMATICAS.pptx
PPT
introduccion a las_web en el 2025_mejoras.ppt
PPTX
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
PDF
Estrategia de apoyo tecnología grado 9-3
PPTX
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
PDF
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
PDF
Maste clas de estructura metálica y arquitectura
PPTX
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
PDF
Calidad desde el Docente y la mejora continua .pdf
PPTX
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
PDF
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.
Propuesta BKP servidores con Acronis1.pptx
CyberOps Associate - Cisco Networking Academy
programa-de-estudios-2011-guc3ada-para-el-maestro-secundarias-tecnicas-tecnol...
RAP02 - TECNICO SISTEMAS TELEINFORMATICOS.pptx
Estrategia de apoyo tecnología miguel angel solis
Plantilla para Diseño de Narrativas Transmedia.pdf
Acronis Cyber Protect Cloud para Ciber Proteccion y Ciber Seguridad LATAM - A...
Que son las redes de computadores y sus partes
Presentación PASANTIAS AuditorioOO..pptx
REDES INFORMATICAS REDES INFORMATICAS.pptx
introduccion a las_web en el 2025_mejoras.ppt
IA de Cine - Como MuleSoft y los Agentes estan redefiniendo la realidad
Estrategia de apoyo tecnología grado 9-3
COMO AYUDAN LAS TIC EN LA EDUCACION SUPERIOR.pptx
MÓDULO DE CALOR DE GRADO DE MEDIO DE FORMACIÓN PROFESIONAL
Maste clas de estructura metálica y arquitectura
sa-cs-82-powerpoint-hardware-y-software_ver_4.pptx
Calidad desde el Docente y la mejora continua .pdf
ANCASH-CRITERIOS DE EVALUACIÓN-FORMA-10-10 (2).pptx
Instrucciones simples, respuestas poderosas. La fórmula del prompt perfecto.

1.2. kotlin (1)

  • 2. Hello World 2 class Greeter(val name: String) { fun greet() { println("Hola $name") } } fun main(args: Array<String>) { Greeter(args[0]).greet() } package ar.edu.unq.ui.greeting; public class Greeter { private String name; public Greeter(String name) { this.name = name; } public void greet() { System.out.println("Hello " + name); } public static void main(String[] args) { new Greeter(args[0]).greet(); } } ◎ Package opcional ◎ Entry point como función (no necesita estar en una clase) ◎ Los ; son opcionales ◎ Scope public por default ◎ Constructor primario en la declaración
  • 3. Consideraciones ◎ Esta clase es una presentación de Kotlin. ◎ No es una guía exhaustiva. ◎ Todo nuevo lenguaje se aprende codeando. ◎ Cuando surjan dudas primero vayan a https://kotlinlang.org/docs/reference/ ◎ También tienen guías nativas en https://play.kotlinlang.org/koans/ ◎ Y tienen las Prácticas y los TPs para codear. 3
  • 4. Acerca de Kotlin ◎ Lenguaje de Propósito General ◎ Multi Plataforma ◎ Tipado Estático ◎ Inferencia de Tipos 4 ◎ Puede compilar a ○ JVM (por ahora solo nos importa este) ○ Android ○ Javascript ○ Assembler Nativo ◉ iOS ◉ MacOS ◉ Windows ◉ Linux ◉ WebAssembly ◎ Desarrollado por JetBrains ◎ El nombre fue dado por la Isla de Kotlin, cerca de San Petersburgo (Rusia) ◎ Vamos a usar la versión 1.3
  • 5. Funciones 5 fun printMessage(message: String): Unit { println(message) } fun printMessageWithPrefix(message: String, prefix: String = "Info") { println("[$prefix] ${message}") } fun sum(x: Int, y: Int): Int { return x + y } fun multiply(x: Int, y: Int) = x * y fun main() { printMessage("Hello") printMessageWithPrefix("Hello", "Log") printMessageWithPrefix("Hello") printMessageWithPrefix(prefix = "Log", message = "Hello") println(sum(1, 2)) }
  • 6. Variables 6 // Variable mutable tipada e inicializada var a: String = "initial" // Variable inmutable tipada e inicializada val b: Int = 1 // Variable inmutable inicializada con inferencia de tipo val c = 3 // Variable mutable declarada con tipo sin inicializar var d: Int // Variable inmutable declarada con tipo sin inicializar val e: Int // No se rompe la inmutabilidad con la asignación condicional if (someCondition()) { e = 1 } else { e = 2 }
  • 7. Null Safety 7 var neverNull: String = "Esta variable no puede ser null" neverNull = null // Compilation Error var nullable: String? = "Esta variable puede ser null" nullable = null // Todo bien var inferredNonNull = "La inferencia de tipo no permite nullable" inferredNonNull = null // Compilation Error // Argumento no nullable fun strLength(strNotNull: String): Int = strNotNull.length strLength(neverNull) // Todo bien strLength(nullable) // Compilation Error // Argumento nullable fun describeString(maybeString: String?): String { if (maybeString != null) { return "Caracteres = ${maybeString.length}" } else { return "Eso no es un string, es null" } } // Argumento y resultado nullable fun strLengthNulleable(maybeString: String?): Int? = strNotNull?.length
  • 8. Clases (I) 8 // Si se declara una clase "vacía", se pueden omitir las llaves class Customer // El header puede contener las propiedades // y funciona como constructor class Contact(val id: Int, var email: String) fun main() { val customer = Customer() // No se necesita new, sí los () val contact = Contact(1, "mary@gmail.com") // Accessors automáticos println(contact.id) contact.email = "jane@gmail.com" }
  • 9. Clases (II): Herencia 9 class FinalDog // Por defecto las clases son final class Bulldog : FinalDog // Error de compilación, Dog es final // Para que pueda ser heredada hay que marcarla como open open class Dog { // Lo mismo para los métodos, por defecto no se pueden sobreescribir open fun sayHello() = println("wof wof!") fun finalHello() = println("soy irremplazable") } class Yorkshire : Dog() { override fun sayHello() = println("wif wif!") // Error de compilación override fun finalHello() = println("soy irremplazable") } fun main() { val dog: Dog = Yorkshire() dog.sayHello() // Output: wif wif! }
  • 10. Uso del Condicional (if) 10 var max = a // Uso tradicional if (a < b) { max = b } if (a > b) { max = a } else { max = b } ◎ En Kotlin if no es una estructura de control sino una expresión. ◎ Con lo cual siempre retorna un valor. // Uso como expresión val max = if (a > b) a else b // Si se utilizan bloques, // el valor del bloque // es la última expresión val max = if (a > b) { print("a es mayor") a } else { print("b es mayor") b }
  • 11. val blue = "Blue" val sameBlue = "Blue" println(blue == sameBlue) // true println(blue === sameBlue) // true, son la misma referencia val numbers = setOf(1, 2, 3) val sameNumbers = setOf(2, 1, 3) println(numbers == sameNumbers) // true, son conjuntos iguales println(numbers === sameNumbers) // false, son distintas referencias val bart = User("Bart") val bort = User("Bart") println(bart == bort) // true, se llaman igual println(bart === bort) // false, son distintas instancias Igualdad 11 ◎ = asignación ◎ == comparación estructural ◎ === comparación referencial class User(val name: String) { override fun equals(other: Any?): Boolean = other is User && other.name == this.name override fun hashCode(): Int = name.hashCode() }
  • 12. Loops (for, while, do while) 12 val cakes = listOf( "frutilla", "merengue", "chocolate" ) // Se puede iterar directamente // sobre los elementos for (cake in cakes) { println("Torta de $cake") } // Y también sobre los índices for (i in array.indices) { println(array[i]) } ◎ Funcionan de manera similar a otros lenguajes var cakesEaten = 0 while (cakesEaten < 5) { eatACake() cakesEaten++ } var cakesBaked = 0 do { bakeACake() cakesBaked++ } while (cakesBaked < 5)
  • 13. Rangos 13 // Rango ascendente for(i in 0..3) print(i) // 0 1 2 3 // Rango ascendente con salto for(i in 2..8 step 2) print(i) // 2 4 6 8 // Rango descendente for (i in 3 downTo 0) print(i) // 3 2 1 0 // Rango descendente con salto for (i in 9 downTo 0 step 3) print(i) // 9 6 3 0 // Rango ascendente de caracteres for (c in 'a'..'d') print(c) // a b c d // Rango desc. de caract. con salto for (c in 'z' downTo 's' step 2) print(c) // z x v t // Se puede evaluar pertenencia val x = 2 val inRange = if (x in 1..10) print(x) // true, 2 if (x !in 1..4) print(x) // false
  • 14. Clases Especiales (I): Data Classes 14 // Las Data Classes son ideales para almacenar información // Definen automáticamente métodos como: // equals(), copy(), hashCode(), toString() data class User(val name: String, val id: Int) fun main() { val user = User("Alex", 1) println(user) // User(name=Alex, id=1) val secondUser = User("Alex", 1) val thirdUser = User("Max", 2) println(user == secondUser) // true println(user == thirdUser) // false // copy() genera una nueva instancia con las mismas propiedades println(user.copy()) // User(name=Alex, id=1) // Pero se pueden sobreescribir las propiedades deseadas println(user.copy("Max")) // User(name=Max, id=1) println(user.copy(id = 2)) // User(name=Alex, id=2) }
  • 15. Clases Especiales (II): Object 15 // Singleton of Prices object Prices { var standard: Int = 30 var holiday: Int = 50 var special: Int = 100 fun average() = sumAll() / 3 private fun sumAll() = standard + holiday + special } fun main() { println(Prices.standard) // 30 println(Prices.average()) // 60 } ◎ Un Object se puede pensar como la única instancia de una Clase ◎ Es en definitiva una aplicación del patrón Singleton fun main() { // Se puede utilizar como una expresión // con propiedades y comportamiento val unique = object { var unique: Int = 42 fun average() = (Prices.average() + unique) / 2 } println(unique.average()) // 51 // Se le puede cambiar el estado // (porque es una instancia ;) unique.unique = 0 println(unique.average()) // 30 }
  • 16. Colecciones (I): Listas & Conjuntos 16 val roots: List<String> = listOf("root", "groot") val sudoers: MutableList<String> = mutableListOf("tony", "steve", "bruce") val planets: Set<String> = // Inmutable Set setOf("tierra", "titan", "titan", "asgard", "tierra") fun main() { roots.add("fury") // <- Compilation Error sudoers.add("carol") println("${roots.size}") // 2 for (root in roots) println(root) // root, groot sudoers.forEach { e -> println(e) } // tony, steve, bruce, carol planets.forEach { println(it) } // tierra, titan, asgard } ◎ Una list es una colección ordenada de elementos. ◎ Puede ser mutable o inmutable. ◎ Un set es una lista sin repetidos.
  • 17. Colecciones (II): Maps 17 val codes: Map<Int, String> = mapOf(1 to "Intro", 2 to "Orga", 3 to "Mate1") val approved: MutableMap<String, Int> = mutableMapOf("Intro" to 10, "Orga" to 8, "Obj1" to 9) fun approved(code: Int) = approved.containsKey(codes[code]) fun score(name: String): Int? = if (approved.containsKey(name)) approved.getValue(name) else null fun main() { println(approved(1)) // true println(approved(3)) // false println(score("Intro")) // 10 println(score("UI")) // null approved.forEach { key, value -> println("$key: $value") } // Intro: 10, Orga: 8, Obj1: 9 codes.forEach { println("${it.key}: ${it.value}") } // 1: Intro, 2: Orga, 3: Mate1 } ◎ Un map es una colección clave/valor. Puede ser mutable o inmutable.
  • 18. 18 Operaciones con Colecciones val list = listOf(1, 2, 3) Filter list.filter { it > 2 } // [3] Map list.map { it * 2 } // [2, 4, 6] Any, All, None list.any { it == 2 } // true Find, FindLast list.find { it > 3 } // null First, Last list.first() // 1 Count list.count { it > 1 } // 2 Min, Max list.max() // 3 Sorted list.sortedBy { -it } // [3, 2, 1] Get or Else list.getOrElse(7) { 42 } // 42
  • 19. Uff... 19 ◎ Hasta acá un pantallazo de cómo se puede programar en Kotlin ◎ Tienen mucho más para investigar ◎ ¿Vemos un ejemplo en PC?