Guía Básica de Kotlin
kotlin design

Guía Básica de Kotlin


Kotlin es un lenguaje de programación de propósito general que se ejecuta en la máquina virtual de Java y también se puede compilar en el código fuente de JavaScript o usar la infraestructura del compilador LLVM. Si buscas un lenguaje moderno y sobre todo para el desarrollo android, Kotlin es la mejor opción. En esta Guía Básica aprenderás lo básico del lenguaje.

Variables y Constantes

Las variables nos ayudan a asignar valores y las constantes son variables que no se pueden cambiar. Las variables se declaran con la palabra reservada var

// Para declarar las variables usamos val + el nombre de la variable + = + el valor
var stringVar = "Cadena de texto"
var numberVar = 123

las constantes se declaran con la palabra reservada val, las constantes no se les puede reasignar un valor.

val firstConstant = "The earth is spheroid"

Tipos de datos (Principales)

Los tipos de datos son fundamentales para la programación. Se utilizan para almacenar y procesar datos. Los principales en Kotlin son:

🔹String// Los strings son cadenas de texto, se escriben entre comillas simples o dobles.

val cadena = "Strings"
// podemos ser explícitos al declarar usando ':'+el tipo de dato
val cadena2: String = "Cadenas"
//println nos sirve para mostrar el mensaje en consola el símbolo '+' para unir los strings
println(cadena + cadena2)

🔹Enteros (Byte, Short, Int, Long) son los números enteros.

val num1 = 12
val num2 = 8
val res = num1 + num2;
println(res)

🔹Decimales (Float, Double) son números que contienen decimales

val float = 12.4f
val double = 2.4
val resDecimals = float + double
println(resDecimals)

🔹Booleans son valores de verdadero y falso

val booleano = true
val bool2 = false
println(booleano == bool2) // compara si son iguales_ retorna falso

Operadores Principales

Operadores condicionales y lógicos

símboloDescripción
>Mayor que
>=Mayor o igual que
<Menor que
<=Menor o igual que
==Igualdad
!=Desigualdad
&&Operador ‘y’
||Operador ‘o’
!Negar

Operadores aritméticos

símboloDescripción
+Suma: suma dos valores
-Resta: resta dos valores
/Division: divide dos valores
*Multiplicación: multiplica dos valores
%Modulo: devuelve el resto de la division de dos valores
++Incremento: incrementa en 1 el valor
Decremento: disminuye en 1 el valor
**Exponente: eleva un valor a la potencia de otro valor

Condicionales

Los condicionales son bloques de código que se ejecutan solo cuando se cumplen las condiciones que especifican.

// if simple
val age = 1
if (age >= 18) {
    // lo que se ejecuta si la condicional es cierta
    println("$age es mayor de edad")
} else { // lo que se ejecuta si la condicional es falsa
    println("$age es menor de edad")
}
// if con operador &&
//ambas condiciones tienen que ser verdaderas para entrar
if (age == 65 && age >= 18) {
    println("$age es mayor de edad y es una persona de la tercera edad")
} else {
    println("$age es menor de edad")
}
// if con operador ||
// al menos 1 de las condicionales debe ser verdadera
if (age == 65 || age >= 18) {
    println("$age Es mayor de edad")
} else {
    println("$age Es menor de edad")
}
// else if nos ayuda a evaluar más condicionales
if (age >= 18 && age < 65) {
    println("Mayor de edad")
} else if (age >= 65) {  // si la condición anterior no se cumple y esta si
    println("Eres una persona de la tercera edad")
    //NOTA: se pueden agregar varios else if
} else { // si ninguna de las operaciones anteriores se cumple
    println("Eres menor de edad")
}

Sentencia When

La declaración when en Kotlin (en otros lenguajes switch) se usa para especificar las condiciones para que se ejecute un bloque de código. Se puede usar con sentencias if, bucles y otras sentencias when

val country = "México"
when (country) {
  //evaluamos una condición
  "Francia" -> {
          // si se cumple ira esta condición
          println("habla Frances")
  }
  "EUUA" -> {
          println("habla Ingles")
  }
  "Portugal" -> {
          println("habla Portugues")
  }
  // podemos separar con comas si tenemos varias opciones que cumples un mismo objetivo
  "México", "España", "LATAM" -> {
      println("habla Español")
  }
  // si ninguna de las anteriores opciones cumple la condicional
  else -> {
      println("aun no tenemos tu idioma")
  }
}

When con rangos

podemos evaluar por rango con when, supongamos que tenemos que clasificar una arma por su alcance

val range = 100;
when (range) {
    // con "in" seguido de numero a .. numero b podemos establecer un intervalo
    in 0..25 -> {
        println("Arma de corto alcance")
    }
    in 25..50 -> {
        println("Arma de mediano alance")
    }
    in 50..75 -> {
        println("Arma de largo alance")
    }
    else -> {
        println("Arma con demasiado alcance")
    }

}

Arreglos

Los arreglos son listas ordenadas de datos

// para declararlo usamos val o var + el nombre del arreglo + '=' + arrayListOf + <Tipo de dato>
val fruits = arrayListOf<String>()
// para añadir datos al array usamos .add
fruits.add("Fresa")
fruits.add("Mango")
println(fruits)
// si queremos añadir un conjunto de datos usaremos .addAll y listOf para crear una lista
fruits.addAll(listOf("Aguacate", "Pera", "Sandia", "Uva"))
println(fruits)
// para poder acceder a los datos dentro del arreglo usaremos la posición, NOTA: las posicione empiezan desde 0
val strawberry = fruits[0]
val grapes = fruits[5]
println("Frutas pequeñas $strawberry y $grapes")
// eliminar datos
fruits.removeAt(3)
println(fruits)
// recorrer arreglos/ pasar por cada valor
fruits.forEach {
    println(it) // it: es el iterador va tomar como valor la posición por cada elemento
}
// para saber la cantidad de elementos de nuestro array usaremos count
println("Total de frutas: " + fruits.count())
// podemos acceder de forma rápida al primer y ultimo elemento con
println(fruits.first())
println(fruits.last())
// vaciar el array
fruits.clear()
println("Total de frutas: " + fruits.count())

Mapas / Diccionarios

Los mapas son una de las estructuras de datos más importantes de Kotlin. Se utilizan para almacenar pares clave-valor y proporcionan una forma de recuperar valores en función de sus claves.

// definimos el nombre + Map<Tipo de dato de la clave , Tipo de dato del valor> +'='+ mapOf()
var names: Map<Int, String> = mapOf()
// añadir elementos, al añadirlos con map of, el mapa se crea de cero
names = mapOf(1 to "Juan", 4 to "Pedro")
println(names)
// si queremos añadir elementos sin eliminar los anterior mutaremos el mapa
names = mutableMapOf(1 to "Juan", 4 to "Pedro")
// añadir un elemento
names[2] = "Alex"
// también podemos usar put
names.put(3, "Alicia")
println(names)
// las claves no se pueden repetir es decir no podemos hacer esto para añadir
/*
* names.put(3,"Marcelo") esto actualizara el valor
* */
// los valores si se pueden actualizar
names.put(3, "Marcelo")
println(names)
// acceder a valores
println(names[1])
// eliminar
names.remove(2)
println(names)

Bucles

Los bucles son una construcción de programación que permite al programador ejecutar un conjunto de instrucciones repetidamente. Hay tres tipos de bucles en Kotlin: bucles for, while y do-while.

for

Se utiliza un bucle for cuando se conoce el número de iteraciones. Ejecutará los bloques de código hasta que se cumpla la condición.

val fruits = listOf("Fresa", "Mango", "Aguacate", "Pera", "Sandia", "Uva")
val name = mutableMapOf(1 to "Juan", 4 to "Pedro", 3 to "Marcelo")
//for para recorrer arreglos
for (element in fruits) {
    println(element)
}
//for para recorrer mapas
for (element in name) {
    println("${element.key} , ${element.value}")

for (x in 0..10) {
    println(x) // son 11
}
//until no toma el cuenta el ultimo numero
for (x in 0 until 10) {
    println(x) // son 10
}
// con step podemos definir el incremento
for (x in 0..10 step 2) {
    println(x)
}
// cuenta regresiva
for (x in 10 downTo 0) {
    println(x)
}

while

Un ciclo while se usa cuando no se sabe cuántas veces se debe ejecutar un bloque de código.

// while
var x = 0
while (x < 10) {
    println(x)
    x++
}
x = 0
// while con incrementos
while (x < 10) {
    println(x)
    x += 2
}

do-while

Un ciclo do-while ejecuta su bloque de código al menos una vez, incluso si la condición se evalúa como falsa en el primer intento.

// while
var x = 0
do {
    println(x)
    x++
} while (x < 10)

Null Safety

Seguridad contra nulos, nos ayuda a evitar errores de ejecución por variables nulas

val string = "Hola mundo"
// string= null ❌     Esto daría un error
println(string)
// Variable null safety
// tendremos que escribir la variable e indicar el tipo de dato y a lado un '?'
var nullString: String? = "Hola null safety"
nullString = null
println(nullString)
// Safe Call
// El símbolo ? nos ayuda en caso de ser nulo, no ejecutara esta operación
println(nullString?.length)

Funciones

Funciones, nos permiten reutilizar partes del código; son partes de código que hacen un tarea especifica. Estas pueden transmitir como si fueran datos.También se pueden anidar dentro de otras funciones o clases.

// palabra reservada fun + el nombre de la función () {}
fun funciones() {
    // aquí ira el código.
    // para llamarlas se usa lo siguiente nombreFuncion()
    // estamos llamando una función que se declara más abajo
    sayHello()
    // estamos llamando una función que recibe un parámetro
    sayName("Juan")
    // estamos llamando una función que retorna un valor para poder almacenarlo
    val sumRes: Int = sum(12, 12)
    println(sumRes)
    // podemos usar varias veces las funciones
    println(sum(12, sum(13, 12)))
}
// función simple
fun sayHello() {
    println("Hola")
}
//función con parámetros, estas nos permiten reutilizar código y tener resultado dígitos.
fun sayName(name: String) {
    println("Hola $name ")
}
// funciones con valores de retorno
fun sum(x: Int, y: Int): Int {
    val res = x + y
    return res
}