Este documento presenta un resumen del meetup "Android+Kotlin" del 12 de Octubre de 2017 en IT Master. El orador Pablo Angel Veliz dará una introducción al lenguaje Kotlin para Android, cubriendo temas como variables, manejo de nulos, bucles, clases, funciones de extensión y expresiones lambda. El taller también comparará el desarrollo en Android Studio 2.X vs 3 y mostrará ejemplos prácticos de cómo usar estas características de Kotlin.
Android+Kotlin - Meetup 12 de Octubre del 2017 Buenos Aires Argentina
1. Android+Kotlin
MEETUP 12 Octubre 2017
LUGAR: IT Master (https://www.itmaster.com.ar/)
Pablo Angel Veliz
@paveliz
www.linkedin.com/in/pabloveliz/
paveliz.blogspot.com.ar/
github.com/paveliz/
2. Android+Kotlin: Primeros Pasos
Pablo Angel Veliz
@paveliz
www.linkedin.com/in/pabloveliz/
paveliz.blogspot.com.ar/
Soy desarrollador e instructor de Android desde hace más de 4 años. Actualmente
doy clases en IT Master y estoy a cargo del curso OnLine de la Universidad
Tecnológica Nacional (UTN).
Estoy a cargo de un equipo de desarrollos mobile y web en VN Studios
(http://www.vnstudios.com). Fui co-fundador y estuve a cargo del desarrollo de
pickmebus (www.pickmebus.com), una aplicación social con el objetivo de socializar y
mejorar el trasporte público en colectivo (bus).
github.com/paveliz/
4. Pablo Angel Veliz
Android+Kotlin: ¿Por qué Kotlin?
CONCISO: reducción de código innecesario
SAFE: Permite evitar errores como los famosos “null pointer exception”.
INTEROPERABILIDAD: Compatible con lo existente (JVM, Android,
Navegador).
TOOL-FRIENDLY: Se puede desarrollar con cualquier IDE.
6. Pablo Angel Veliz
Android+Kotlin: ¿Por qué Kotlin?
JVM
Kotlin es ideal para el desarrollo de aplicaciones server-side.
Como ya se sabe, es compatible con cualquier stack basado en
java.
Referencia: https://kotlinlang.org/docs/reference/server-
overview.html
7. Pablo Angel Veliz
Android+Kotlin: ¿Por qué Kotlin?
Browser
Kotlin tiene una implementación de front-end, traduciendo
(transpiling) kotlin a JavaScript.
Referencia: https://kotlinlang.org/docs/reference/js-
overview.html
8. Pablo Angel Veliz
Android+Kotlin: ¿Por qué Kotlin?
Native
Es un proyecto de LLVM (Low Level Virtual Machine) para
permitir compilaciones donde no es posible tener la virtual
machine…, ejemplo iOS.
Referencia: https://github.com/JetBrains/kotlin-native
9. Pablo Angel Veliz
Android+Kotlin: ¿Por qué Kotlin?
Android
Kotlin ya es lenguaje oficial de desarrollo en Android.
Referencia: https://kotlinlang.org/docs/reference/android-
overview.html
13. Pablo Angel Veliz
Android+Kotlin: WORKSHOP
• Kotlin en Android Studio 2.X vs Android Studio 3
• Introducción el lenguaje
• VAR, VAL
• Manejo de Nulos
• if, when
• for, while
• Classes, Data Classes
• Extension Function
• Lambda Expressions
15. Pablo Angel Veliz
Variables
// Variables Inmutables SIN Declaración de Tipo:
val nombre = “Pablo"
val edad = 22
// Variables Inmutables CON Declaración de Tipo:
val otroNombre : String = “Pablo"
val otroEdad : Int = 22
// Variables mutables
var pais = "Argentina"
var otroPais : String = "Argentina"
17. Pablo Angel Veliz
Manejo de Nulos
var parametro: String? = null
Si luego quiero realizar una operación como con Java usando el length, tendremos el siguiente problema:
18. Pablo Angel Veliz
Manejo de Nulos
var i: Int? = parametro?.length
¿que es esto? es una "safety operation" u operación "segura" como Kotlin lo llama. Básicamente, en ambos
lados declaramos con el "?" que la operación puede dar null y esto NO dará Null Pointer Exception.
Si estamos completamente seguros que la variable es segura y no dará problema de nulos, Kotlin nos deja
declararlo de la siguiente manera:
var i: Int = parametro!!.length
20. Pablo Angel Veliz
FOR
El “for” se hace un tanto diferente a Java
for(i in 1..10) {
println("El valor de i: $i")
}
for(c in "Kotlin") {
println(c)
}
val lenguajes = listOf("java", "c++", "kotlin")
for( leng in lenguajes) {
println(leng)
}
for ( i in 10 downTo 1) {
println(i)
}
for ( i in 10 downTo 1 step 2) {
println(i)
}
23. Pablo Angel Veliz
WHEN
En lugar de Switch tengo When y es mucho mas poderoso!
var precio = 29
when(precio) {
0 -> println("Es cero!")
in 1..10 -> println("Está de oferta!")
!in 1..10 -> println("NO Está de oferta!")
in 11..29 -> println("Está correctoa!")
else -> println("Posible Error!")
}
when {
precio <= 10 -> println("Está de oferta!")
}
var resultado = when {
precio <= 10 -> 11
else -> 0
}
25. Pablo Angel Veliz
Classes
El concepto de clases es muy similar al de java.
class Aula1 (name: String, floor: Int) {
val nombre: String
val piso: Int
init {
this.nombre = name
this.piso = floor
}
}
// Botón derecho, "join declaration and assigment"
class Aula2 (name: String, floor: Int) {
val nombre: String = name
val piso: Int = floor
}
// Botón derecho, "Move to Constructor"
class Aula3 (val nombre: String, val piso: Int) {
}
26. Pablo Angel Veliz
Métodos
class persona (val name : String) {
fun localizar() {
}
fun yaExiste1() : Boolean {
return name.isBlank()
}
// Convert to "Expression Body"
fun yaExiste2() : Boolean = name.isBlank()
}
27. Pablo Angel Veliz
Data Classes
Data Classes también es un concepto nuevo que no existe en Java.
class DireccionTipoClass(val calle : String,
val numero: String,
val cp: String,
val localidad: String)
data class DireccionTipoDATAClass(val calle : String,
val numero: String,
val cp: String,
val localidad: String)
// Ahora DireccionTipoDATAClass tiene automáticamente métodos como: equals(), copy()...
fun main() {
val Oficina1 = DireccionTipoClass("Thames", "2215", "1024", "Palermo")
val Oficina2 = DireccionTipoDATAClass("Thames", "2215", "1024", "Palermo")
val Oficina3 = Oficina2.copy()
}
28. Pablo Angel Veliz
Herencia
En Kotlin, los tipos de clases son por default "final". Para que una clase puede tener herencias, debe ser una
"Open Class". En java por default todas las clases son Open en Kotlin no.
open class Forma(val name: String) {
open fun area() = 0.0
}
class Circulo(name: String, val radius: Double) : Forma(name) {
override fun area() = Math.PI * Math.pow(radius, 2.0)
}
fun principalHerencia() {
val circulo = Circulo("pequeño circulo", 2.0)
val area = circulo.area()
}
29. Pablo Angel Veliz
instanceof <-> is
“is” es el equivalente a “instanceof” de java
fun smartCast() {
val movil : Drivable = Bicileta()
movil.drive()
if(movil is Bicileta) {
movil.cambiarRueda()
}
if(movil is Barco) {
movil.iniciarMotor()
}
}
31. Pablo Angel Veliz
Lambda Expression
Las expresiones lambda permiten pasar funcionalidad como argumento de una forma muy simple y sin tener
que usar clases anónimas. Esto hace que simplifique mucho la codificación.
El formal en general de una expresión lambda es:
{
param1, param2 -> //parámetros separados por coma
param1 + param2 //código a ejecutar
}
32. Pablo Angel Veliz
Lambda Expression
Supongamos temenos la típica acción de Click, en java sería:
button.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v){
doSomething();
}
});
33. Pablo Angel Veliz
Lambda Expression
En Koltlin quedaría:
button.setOnClickListener({ view -> doSomething() })
34. Pablo Angel Veliz
Lambda Expression
Aplicación Práctica: llevamos el típico selector de menú a un código mucho mas limpio usando Lambda y When
36. Pablo Angel Veliz
Extension Functions
Las “extension function” son una de las grandes novedades de Kotlin y es un tema muy potente. Básicamente
una extension function me permite extender cualquier objeto.
fun String.comparando(): String {
this.compareTo("Hola")
return "Estás igual!"
}
fun TestEF () {
val texto : String = ""
var resultado = texto.comparando()
}
37. Pablo Angel Veliz
Extension Functions
El siguiente código es uno de los tantos ejemplos prácticos que se pueden usar:
val etHolaMundo = findViewById(R.id.et_HolaMundo) as TextView
if( etHolaMundo.text.toString().isBlank() ) {
etHolaMundo.text = "Ahora tiene un valor"
}
if (etHolaMundo.estaVacio()) {
etHolaMundo.text = "Ahora tiene un valor"
}
}
private fun TextView.estaVacio() = this.text.toString().isBlank()
Kotlin tiene de una forma más natural implementado los conceptos de "inmutabilidad" de las variables. ¿qué significa esto?, básicamente el concepto habla de que el valor de una variable NO pueda ser modificado luego de su inicialización. En Java, todas las variables/objetos mutan (a menos que estén indicadas explícitamente como "final"). Mutar significa básicamente, que cualquier otra parte del código podría modificar su valor.
En Kotlin usaremos "val" usualmente para justamente crear variables inmutables. De hecho, el propio Android Studio al ver que definimos una variable cuyo valor es luego modificado o caso contrario, nunca se modifica, hará automáticamente la sugerencia de cambiar un var a un val o viceversa.
Otro tema muy interesante en Kotlin es que NO necesito declarar los tipos, los mismos se infieren de su contenido.