Java to Kotlin: From Zero to Hero

Daniel Anaya
6 min readAug 3, 2018

--

Kotlin by JetBrains

Sintaxis basica

Lo primero es familiarizarnos con el entorno de desarrollo y si comparamos con java y algun IDE de preferencia : Eclipse , Netbeans , IntelliJ IDEA el tercero es la mejor opción , aunque existen plugin para eclipse y netbeans pero lo mas recomendable es optar por IntelliJ.

Otra alternativa para practicar la sintaxis de manera online : https://try.kotlinlang.org ✌️

Un estándar utilizado por la JVM para iniciar la ejecución de cualquier programa Java es el metodo main en Kotlin tenemos la función main con ello vamos ejecutar nuestros ejemplos .

Definición de variables

En Kotlin, tenemos dos tipos de variables: VAR O VAL.

El primero : VAR , es una referencia mutable (lectura-escritura) que se puede actualizar después de la inicialización. La palabra clave VAR se usa para definir una variable en Kotlin. Es equivalente a una variable Java normal (no final). Si nuestra variable necesita cambiar en algún momento, debemos declararla usando la palabra clave VAR. Veamos un ejemplo de una declaración de variable:

console output : BANANA

El segundo : VAL , es equivalente a una variable Java con el modificador final. Usar variables inmutables es útil, ya que asegura que la variable nunca se actualizará por error. El concepto de inmutabilidad también es útil para trabajar con múltiples hilos sin preocuparse por la sincronización de datos adecuada. Para declarar variables inmutables, usaremos la palabra clave VAL como se muestra en el ejemplo :

Error:Val cannot be reassigned

Type inference

Como vimos en ejemplos anteriores, a diferencia de Java, el tipo de variable se define después del nombre de la variable.

A primera vista, esto puede parecer extraño para los desarrolladores de Java, pero esta construcción es un elemento básico de una característica muy importante de la inferencia de tipos en Kotlin. La inferencia de tipo significa que el compilador puede inferir el tipo del contexto (el valor de una expresión asignada a una variable). Cuando la declaración de variables y la inicialización se realizan juntas (una sola línea), podemos omitir la declaración de tipo.

“Podemos omitir la declaración de tipo”

“AMBAS DECLARACIONES SON VÁLIDAS”

Pero ¿realmente necesitamos una declaración de tipo implícita para determinar el tipo de variable?

“LENGUAJE INTUITIVO QUE DEJA LAS FORMALIDADES”

Afortunadamente, podemos omitir el tipo al declarar una variable, porque el compilador intentará determinar el mejor tipo para la variable a partir del contexto actual.

En ejemplo 03 la variable strNumber la declaración de tipo se ha omitido, pero el tipo de variable todavía se establece implícitamente en Cadena, porque Kotlin es un lenguaje fuertemente tipado. Es por eso que las dos declaraciones anteriores son las mismas, y el compilador de Kotlin aún podrá validar correctamente todos los usos futuros de la variable.

“KOTLIN ES LENGUAJE FUERTEMENTE TIPADO”

Strict null safety

Una de las características únicas de este lenguaje es que puede detectar un null en la compilación con el fin de detectar muchos errores relacionados con NullPointerException en etapas muy tempranas del desarrollo.

console output : null

Como se observa en el ejemplo el compilador permitirá la asignación nula, porque el tipo está marcado como nullable con el sufijo de signo de interrogación (?).

No podemos llamar al método de un objeto potencialmente anulable, a menos que se realice una verificación de nulidad antes de una llamada como en este ejemplo :

console output : null

Playing with Functions

En Java, la clase es el componente básico del código. Kotlin, por otro lado, admite la programación funcional; por lo tanto, hace posible crear programas completos o bibliotecas sin ninguna clase. La función es el bloque de construcción más básico en Kotlin.

Puede que estés pensando en que diferencia una función con un método .Las definiciones comunes son las siguientes:

— Una función es una pieza de código que se llama por nombre.
— El método es una función asociada con una instancia de clase(objeto).

“En Kotlin podemos definir funciones que no están asociadas a ningún objeto.”

Por ejemplo si tenemos la función main en otro archivo .kt podriamos ejecutar el ejemplo07 😯

Todos los parámetros se definen como una variable de solo lectura. No hay forma de hacer que los parámetros se puedan modificar, porque dicho comportamiento es propenso a errores y en Java los programadores a menudo lo abusaban.

A menudo se piensa que los argumentos y los parámetros son lo mismo. Estas palabras no se pueden usar indistintamente porque tienen diferentes significados. Un argumento es un valor real que se pasa a la función cuando se llama a una función. El parámetro se refiere a las variables declaradas dentro de la declaración de función. Considere el siguiente ejemplo:

Los argumentos proporcionados a las funciones pueden ser subtipos del tipo especificado en la declaración de parámetro. Como sabemos, en Kotlin, el supertipo de todos los tipos que no admiten nulos es ANY, por lo que debemos usarlo, si queremos aceptar todos los tipos :

“El ANY en kotlin es como el OBJECT en JAVA”

Otra cosa que podemos observar es que la funcion presetGently no se encuentra dentro de ninguna clase , sin embargo la funcion example09 es una función superior la cual lo podemos ejecutar desde la funcion main .Las funciones de nivel superior a menudo son útiles, pero es importante usarlas con prudencia.

A veces, el número de parámetros no se conoce de antemano. En tales casos, podemos agregar un modificador vararg a un parámetro. Permite que la función acepte cualquier cantidad de argumentos. Aquí hay un ejemplo, donde la función está imprimiendo la suma de enteros múltiples:

Functions as First-Class Citizens

La caracteristicas avanzadas de la programación funcional que anteriomente no estaban presentes el desarrollo estandar con android lo incluyeron con java8 con el plugin Retrolambda pero Kotlin presenta muchas más funciones de programación funcional.

La oración “una función es un ciudadano de primera clase en Kotlin” debe entenderse así: es un término que describe una entidad que admite todas las operaciones generalmente disponibles para otras entidades. Estas operaciones generalmente incluyen pasarlas como un argumento, regresar de una función y asignarse a una variable.

Una función es un ciudadano de primera clase en Kotlin

En resumen una función admite la siguientes caracteriticas

  • Puede ser guardado en variables
  • Pueden ser usados como argumentos
  • Pueden ser un valor de retorno
  • Tienen identidad propia

En Kotlin, la notación utilizada para definir un tipo de función es la siguiente:

(types of parameters)->return type

Aqui te muestro algunos ejemplos :

(Int) -> Int: una función que toma Int como argumento y devuelve Int
() -> Int: una función que no toma argumentos y devuelve Int
(Int) -> Unit: una función que toma Int y no devuelve nada (solo la Unit, que no necesita ser devuelta)

Unit es en Kotlin con Void es en JAVA

En este ejemplo podemos observar lo siguiente :

  • La función repeat tiene su segundo parametro una función.
  • Al ejecutar la función repeat la función02 solo es nombrada como una variable .
  • Cuando una función es utilizada como argumento es necesario las {} .

Anonymous functions

La utilidad de este tipo de función es simplicar el envio de una funcionalidad a otra funcion como por ejemplo encapsular una función en una variable para su uso en otra función .

val a: (Int) -> Int = fun(i: Int) = i * 2 
val b: ()->Int = fun(): Int { return 4 }
val c = fun(s: String){ println(s) }

Los tipos de funciones se definieron explícitamente, pero mientras Kotlin tiene un buen sistema de inferencia de tipos, el tipo de función también se puede inferir a partir de tipos definidos por una función predeterminada anónima:

var a = fun(i: Int) = i * 2 
var b = fun(): Int { return 4 }
var c = fun(s: String){ println(s) }

En este ejemplo podemos obsevar como podemos utilizar las funciones anónimas :

Para poder invocar una función anónima utilizamos el método invoke() . Las funciones anónimas son simples y útiles. Son una forma simple de definir funciones que pueden usarse y transmitirse como objetos. Pero hay una manera más simple de lograr un comportamiento similar, y se llama expresiones lambda.

Lambda expressions

La forma más sencilla de definir funciones anónimas en Kotlin es mediante el uso de una función llamada expresiones lambda. Son similares a las expresiones Java 8 lambda con la diferencia que nos permiten cambiar las variables desde el contexto de la creación. Las expresiones de Lambda en Kotlin tienen la siguiente notación:

{ arguments -> function body }

Las lambdas son una de las herramientas más potentes en Kotlin, y en cualquier otro lenguaje moderno, ya que permite modelar funciones de forma mucho más sencilla.

--

--