Empezando con Kotlin
Como hago hace tiempo, la mejor manera de aprender es leer, practicar y explicar a otros.. es la mejor manera de aprender. Así que se vienen una serie de post sobre Kotlin server-side applications y con Android.
Kotlin es moderno, tipado estático y lo que siempre muestran para promocionarlo es que corrige varios problemas de Java como null pointer exceptions o la cantidad de código que hay que excribir. Está inspirado por Swift, Scala, Groovy, C#, etc. Fue diseñado por JetBrains.
Kotlin intena no repetir los errores de otros lenguajes y brindar las ventajas que ofrecen otros (creo que al principio todos los lenguajes prometen lo mismo hasta que quedan viejos).
No es un lenguaje tan nuevo como parece, pero tomó impulso desde 2017 cuando Google anunció el soporte oficial.
No voy a repetir que intenta ser mejores a otros lenguajes modernos, quizás destacar la flexibilidad que ofrese al ser transparente para integrarse a proyectos Java desde JDK 6 y, es Opensourse.
Quizás es destacable destacar que su sintaxis es de fácil lectura y para un programador Java migrar es bastante fácil. Al principio un desarrollador suele escribir código Kotlin con hábitos de Java, pero con el tiempo cambia.
Ejemplos:
var name = “Walter” // se infiere el tipo String
name = “Javier”
var name = “Walter”
name = 2 // error de compilación porque es de tipo String
val name = “Walter”
println(”Mi nombre es $name”)
//imprime: Mi nombre es Walter
val name = “Walter”
println(”Mi nombre es ${name.toUpperCase()}”)
//imprime: Mi nombre es WALTER
En Java cualquier variable puede guardar valor null, pero Kotlin nos fuerza declararlo por ser un lenguaje null safety.
var a: String = “abc”
a = null //error de compilación
var b: String? = “abc”
b = null //con el signo ? compila bien!
Así mismo podemos declarar métodos para que no puedan ser invocados con valores nulos y evitar los tan temidos null pointer exceptions. En vaso que llegue un valor nulo la llamada es ignorada.
variable?.hacerAlgo
Kotlin tiene varios nuevos tipos, por ejemplo Range.
for ( i in 1..10 ) {
print ( i )
} // 12345678910
Introduce un nuevo tipo Pair que combinada con una notación infix (para guardar variables con valores “pares”:
val capitol = “Argentina” to “Buenos Aires”
println(capitol.first) // Imprime: Argentina
println(capitol.second) // Imprime: Buenos Aires
Se puede usar declaraciones deconstructivas:
val (country, city) = capitol
println(country) // Imprime: Argentina
println(city) // Imprime: Buenos Aires
Incluso iterar en una lista de pares:
val capitols = listOf ( “Argentina” to “Buenos Aires” , “Uruguay” to “Montevideo” )
for ( ( country, city) in capitols) {
println ( “La capital de $country es $city” )
}
//Imprime:
// La capital de Argentina es Buenos Aires
// La capital de Uruguay es Montevideo
ó podríamos haber usado foreach:
val capitols = listOf ( “Argentina” to “Buenos Aires” , “Uruguay” to “Montevideo” )
capitols.foreach { ( country, city) ->
println(”La Capital de $country es $ciudad” )
}
Vea que Kotlin distingue entre colecciones mutables a inmutables (List vs MutableList, Set vs MutableSet, Map vs MutableMap, y así....)
val list = listOf(1, 2, 3, 4, 5, 6) //Infiere una List
val mutableList = mutableListOf(1, 2, 3, 4, 5, 6) //Infiere una MutableList
Definición de una función:
fun sum ( a: Int, b: Int) = a + b
println ( sum( 2 + 4 ) ) // Imprime: 6
Podemos asignar valores por defecto cuando definimos una variable:
var b: Int = 10
en el caso que utilicemos esas variables como parámetros y haya algunos parámetros que no tengan valor por defecto, debemos invocar a la función sin omitir variables que no tengan valor previamente asignado.
Así los primeros parámetros deberían ser “obligatorios” y el resto asignar valores en la declaración de la función, para que en la invocación no necesitemos escribir el resto y sólo los primeros parámetros.
Para definir clases, debemos usar el modificador data:
data class Pelota ( var size: Int, val color: String)
val pelota = Pelota ( 12, “roja” )
println ( pelota ) //Imprime: Pelota ( size= 12, color= Roja )
Ahora vemos cómo creamos nuevas clases sin new y lo fácil que copiamos instancias de clase:
val pelota = Pelota ( 12, “Roja” )
println ( pelota) // Imprime Pelota ( size= 12, color= Roja )
val pelotaPequeña = pelota.copy ( size = 3)
println ( pelotaPequeña) // Imprime Pelota ( size= 3, color= Roja )
pelotaPequeña.size++
println ( pelotaPequeña) // Imprime Pelota ( size= 4, color= Roja )
println ( pelota) // Imprime Pelota ( size= 12, color= Roja )
Una de las mejores características en Kotlin son las extensions que nos permiten agregar comportamientos (métodos o propiedades) a clases existentes sin cambiar su implementación. A veces cuando trabajamos con librerías o un framework, necesitamos tener métodos o propiedades extra para algunas clases. Las extensions reducen la verbosidad y quita la necesidad de usar funciones propias de Java (como la clase StringUtils). Muy facil podemos definir extensiones para clases customizadas, librerías de terceros o frameworks (por ej. en Android), en el caso que queramos extender cierta funcionalidad no disponible en la definición básica.
Las Interfaces pueden tener implementación por defecto, siendo que no mantienen estado:
interface DatosBasicos {
val email: String
val name: String
get( ) = email.subtringBewfore(”@”)
}
Kotlin Playground
La forma más rápida de probar Kotlin es Kotlin Playground https://try.kotlinglang.org . Seleccionando la pestaña podemos correr código usando implementaciones Kotlin para JavaScript o JVM (arriba a la derecha) o cambiando entre diferentes versiones de Kotlin (debajo a la derecha).
La función main es el punto de inicio de una aplicación. Así que para que funcionen todos los ejemplos, deberíamos copiarlos allí adentro.
Kotlin a bajo nivel en Android
Enfocado en Android, pero sabiendo que lo podemos compilar en múltiples plataformas, Kotlin puede compilarse a Java bitecode y luego a Dalvik. Así se generarán archivos con extensión .java .kt .class .dex .apk
Así en proyectos que utilicen java y kotlin, el merge se hará en los archivos (o a nivel de) class.
En algunos casos se hace mensión a Kotlin stantard library (stdlib) que al principio era parte de un archivo aparte, pero desde la versión 1.2 viene incluida por default, y añade las funcionalidades esenciales del lenguaje.










