![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015884/gdg_androideando2017.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015893/android_kotlin_logos.jpg)
#androideando2017
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908229/logo.png)
Kotlin
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Que es Kotlin?
- Lenguaje de POO, creado por Jetbrains.
- Se ejecuta sobre la JVM: no solo sirve para Android, sino que potencialmente se podría utilizar para crear nuestro servidor o crear aplicaciones de escritorio que se ejecuten sobre la JVM. También existen algunas variantes de Kotlin, como Kotlin JS, variante de TypeScript (para frontend).
- Lenguaje fuertemente tipado, con apariencia de lenguaje dinámico (estilo Groovy o JavaScript), ofrece lo mejor de dos mundos: el compilador nos sigue ayudando pero no tenemos que escribir tanto código.
- A futuro: Kotlin Native, permitirá ejecutar código prácticamente en cualquier dispositivo. Existe versión de preview, que permite ejecutar aplicaciones en una Raspberry Pi o en un dispositivo IOS.
- Gratis y Open Source.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Filosofía del Lenguaje
-
Pragmático: intenta simplificar nuestra tarea lo máximo posible. No escribir cosas innecesarias. Reducir el código.
-
Conciso: reducir al mínimo cantidad de caracteres. No usar ; (opcional), no escribir new al crear objetos, etc.
-
Seguro: mas seguro que Java ya que el compilador nos ayuda en mas cosas, como seguridad frente a nulos y sealed class entre otros. En varios casos Java nos dejaría ejecutar a pesar de que pueda ocurrir algún error.
-
Interoperable: podemos utilizar todo el código que ya tengamos en Java y agregar Kotlin, o viceversa.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Instalar Plugin Kotlin
En la versión 3.0 de Android Studio ya vendrá incluido.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015962/1.2.png)
File / Settings...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Instalar Plugin Kotlin
Buscar Kotlin Languajes, instalar y reiniciar
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015976/1.3.png)
2
3
1
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Configurar Kotlin
- Crear, en Android Studio, proyecto nuevo de la forma tradicional (empty activity)
- Configurar Kotlin en proyecto
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015989/1.4.png)
2
3
1
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Configurar Kotlin
- Seleccionar opciones, configura automaticamente plugin en nuestro proyecto
2
3
1
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015995/1.5.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4015994/1.6.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Que agrega?
- build.gradle (project)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016003/1.7_build.gradle__project_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Que agrega?
- build.gradle (module)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016006/1.7.1_build.gradle__module_.png)
- Android Extensions: plugin que permite recuperar views de Activities, Fragments y Views
- Anko: Librería creada por el equipo de Kotlin para facilitar tareas del día a día.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Convertir clase Java a Kotlin
- Todo es public por defecto
- extends se reemplaza por :
- override es palabra reservada, obligatoria
- Los tipos se ponen detrás de la variable
- Si un tipo puede ser nulo se marca con ?
- Es opcional escribir ;
Code / Convert Java File to Kotlin File
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016070/1.9_main_java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016061/1.9_main.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Variables
-
Son de tipo estático, con ventajas de lenguajes dinámicos: en la mayoría de los casos el compilador es capaz de inferir de que tipo es la variable que estamos utilizando y no necesitamos especificar el tipo, esto simplifica mucho el código.
-
No hay tipos básicos, son todos objetos. No genera problemas de rendimiento porque el compilador determina si se está usando como objeto o tipo básico y el bitcode generado será acorde al tipo determinado.
-
Como son objetos, no hay conversiones automáticas.
-
var: variable mutable, su valor puede cambiar.
-
val: variable inmutable, su valor puede ser asignado solo una vez dentro de la ejecución actual, similar a final.
-
Unit: objeto que reemplaza al void de Java
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Variables
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016629/1.15_variables_kotlin.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016630/1.14_variables_java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016739/1.16_variables_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4016740/1.17_variables_.png)
No hay conversión automática
Smart Cast: si comprobamos un tipo en una función , podemos utilizar esa variable con el tipo que hayamos comprobado, asi no hacemos el cast manualmente
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Ejemplo
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Ejemplo
String Tamplates: para mostrar variables dentro de un texto.
findViewById no es necesario, con android extensions + synthetic se accede directamente a los elementos del layout
toast y println: funciones de Anko
Cast al final
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Expresion Body
Cuando una función devuelve una sola expresión, se pueden omitir las llaves y se especifica el cuerpo después de un símbolo =
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017672/1.13_suma_es_expresion_body.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017676/1.12_suma_a_expresion_body.png)
alt + enter en función
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
Expresiones Lambdas
Representa una función anónima, reduce la cantidad de código necesaria para ejecutar ciertas tareas que son repetitivas (como escritura de listeners y callbacks).
- Debe estar delimitada por llaves.
- Si la expresión contiene cualquier parámetro, debe declararlo antes del símbolo ->
- Si tiene múltiples parámetros, se separan con comas.
- El cuerpo de la función va luego del signo ->
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Clases
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017550/2.1_clase_suma_java_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017548/2.2_clase_suma_java_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Clases
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017551/2.4_clase_suma_kotlin.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017553/persons-0033.png)
- En el encabezado se especifican parámetros y tipo, funciona como constructor principal.
- Si la clase no tiene cuerpo, las llaves pueden ser omitidas.
- El constructor principal no puede contener ningún código. El código de inicialización se coloca en bloques que están prefijados con la palabra clave init.
- Properties: parámetros de la clase. Si se declaran var el compilador genera automaticamente los getters y setters, si se declaran val, solo genera getters.
- equals, hashCode, toString, copy son generados por defecto.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Uso de Clases
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017652/2.3_main_suma_java_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017653/2.5_main_suma_kotlin.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
- No se utiliza new.
- Se accede a las properties directamente, sin necesidad de usar getters o setters.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Uso de Clases
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017652/2.3_main_suma_java_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017653/2.5_main_suma_kotlin.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
- No se utiliza new.
- Se accede a las properties directamente, sin necesidad de usar getters o setters.
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
- Todas las variables son consideradas no anulables por defecto, el intento de asignar un valor nulo a una variable resultará en error de compilación.
- Para declarar explícitamente que una variable puede aceptar un valor nulo, se agregar un ? al final del tipo de variable.
Seguridad ante Nulos
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017692/nulos.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017693/3.0_nulos.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
- En Java, cada objeto se considera anulable por defecto, razón por la cual las NullPointerException son tan comunes.
- En nuestro ejemplo de la clase Suma, esto compila:
Seguridad ante Nulos
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017696/3.2_nulos_java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017697/WhatsApp_Image_2017-07-29_at_01.00.36.jpeg)
Sin embargo...
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017700/2.1.1_clase_suma_java_.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017656/java.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
- Se deben realizar validaciones de datos nulos si definimos que el objeto puede ser nulo, de esta forma el compilador de Kotlin no nos mostrará error.
- Operador de Invocación Segura ?.
- Operador Elvis ?:
Seguridad ante Nulos
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017701/3.1_nulos.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Otras Optimizaciones sobre Java para profundizar:
- Funciones de extensión
- Enumerados
- Control de Flujo
- Colecciones y rangos
- Sealed clases
- Type Alias
- Co-rutinas
Otras Optimizaciones
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Links & Referencias
Kotlin and Android: https://developer.android.com/kotlin/index.html
Kotlin (Jetbrains): https://kotlinlang.org/
DevExperto de Antonio Leiva: https://devexperto.com/
Slide: https://slides.com/gdgneuquen
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Muchas Gracias!
- Meetup: bit.ly/gdgneuquen
- Google+: bit.ly/gdgneuquenplus
- Facebook: facebook.com/gdgneuquen
- Twitter: @gdgneuquen
- Slack: gdgneuquen.slack.com
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/2908268/logo.png)
Bonus Track
![](https://s3.amazonaws.com/media-p.slid.es/uploads/554144/images/4017657/Kotlin_logo_wordmark.png)
Solo para GDG Neuquen:
- 40% de descuento para acceder a la compra de Curso Kotlin para desarrolladores Android
- 20% de descuento para comprar el libro Kotlin for Android Developers (Formato PDF, EPUB and MOBI)
Gentileza de DevExperto, de Antonio Leiva
Androideando2017 - Kotlin
By GDG Neuquén
Androideando2017 - Kotlin
Taller introductorio para conocer Kotlin para desarrolladores Android - GDG Neuquen
- 686