Diego Alexander Araque Molina - Stefanía Argüelles Reyes
Kotlin es un lenguaje creado por un grupo de programadores de JetBrains que según el líder del desarrollo Andrey Breslav está diseñado para ser un lenguaje orientado a objetos de calidad industrial, fue nombrado el lenguaje del mes en la edición de enero de 2012 de la revista Dr. Dobb.
Para programar en Kotlin es ideal trabajar en el entorno de trabajo de JetBrains IntelliJ IDEA, dado que ellos son los creadores del lenguaje. Para hacer uso de este entorno es necesario tener previamente instalado el JDK.
Instalación del JDK:
De la página web de Oracle descargar el Java Development Kit (JDK) para desarrolladores, en el siguiente enlace http://www.oracle.com/technetwork/java/javase/downloads/jdk10-downloads-4416644.html
Instalación IntelliJ IDEA:
Descargar la versión Community de la página web de IntelliJ IDEA https://www.jetbrains.com/idea/download/#section=windows Realizar la instalación como indica el programa, seleccionar el tipo de sistema y configurar la lectura de archivos de tipo Kotlin
Se procede con el resto de la instalación según indique el programa.
Para crear un nuevo proyecto en el entorno IntelliJ IDEA,
File - New - Project - Kotlin- Kotlin/JVM - Next - en la pestaña Project SDK establecer la ruta del JDK - Finish
En la carpeta src del proyecto
click derecho - New- Package, de igual forma proceder en el paquete >Click derecho - New- Kotlin File/Class
Print:
Muy similar a Python en su estructura
print("Hello, World! --")
println("Hello, World!")
Hello, World! --Hello, World!
null
Variables:
Se declara la variable con ayuda de la palabra reservada 'var' y después se asigna el tipo, en caso de realizar asignación esta determina el tipo de la variable
En caso de ser una variable fija se declara con la palabra reservada 'val'
var w: Int
w = 2
var x: Int
x = 1
println(w)
println(x)
2 1
null
Null:
La referencia nula se realiza con ayuda del operador ? que indica que el puntero o referencia no apunta a un dato valido
val name: String? = null
var lastName: String?
lastName = null
println(lastName)
null
null
String:
Para declarar se hace uso de la palabra reservada 'val', la asignación se realiza con ayuda de las comillas (" "), para realizar concatenación usamos el operador $.
val name = "John"
val lastName = "Smith"
val text = "My name is: $name $lastName"
val otherText = "My name is: ${name.substring(2)}"
println("$name $lastName")
println(text)
print(otherText)
John Smith My name is: John Smith My name is: hn
null
Bits Operations:
Su sintaxis es muy similar a la de Python al igual que en el print
var a: Int
var b: Int
a = 2
b = 4
val andResult = a and b
val orResult = a or b
val xorResult = a xor b
val rightShift = a shr 2
val leftShift = a shl 2
null
Palabras Reservadas:
Las palabras reservadas 'as', 'in', 'is' se utilizan para establecer condiciones in para ejecutar en un rango determinado, is se utiliza para verificar si un objeto pertenece a una clase específica y as, se utiliza para realizar un cast
val other = "Carlos"
var x = 3
if (x is Int) { println("Si es entero") }
val text = other as String
if (x in 0..10) {println(x)}
Si es entero 3
null
if- else
La estructura condicional if- else se realiza de la misma manera que en Java, el uso de llaves es opcional si la sentencia ocupa más de una línea
var valor1:Int
var valor2:Int
valor1= 1
valor2= 2
if (valor1 > valor2) {
print("El mayor valor es $valor1")
}
else {
print("El mayor valor es $valor2")
}
El mayor valor es 2
null
Switch / When:
En Kotlin el Switch se realiza con ayuda de la palabra reservada 'when', puede suplir un switch o una sentencia if-else.
Se establece la condición, la asignación se realiza con ayuda del operador -> y después se coloca la sentencia.
fun main(parametro: Array<String>) {
val x = 4
val y = -6
when {
x > 0 && y > 0 -> println("Primer cuadrate")
x < 0 && y > 0 -> println("Segundo cuadrante")
x < 0 && y < 0 -> println("Tercer cuadrante")
x > 0 && y < 0 -> println("Cuarto cuadrante")
else -> println("El punto se encuentra en un eje")
}
}
null
While/do while :
Se ejecuta de manera similar que en java, mientras la condición se cumpla se ejecuta el ciclo. En el caso de do/while realiza la condición cuando menos una vez
//while
var x = 1
while (x <= 10) {
println(x)
x = x + 1
}
//do/while
var valor = 140
do {
if (valor < 10)
println("El valor tiene un dígito")
else
if (valor < 100)
println("El valor tiene dos dígitos")
else
println("El valor tiene tres dígitos")
valor --
} while (valor != 0)
1 2 3 4 5 6 7 8 9 10 El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene tres dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene dos dígitos El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito El valor tiene un dígito
null
For:
Se realiza de manera similar que en Python, un for por defecto se realiza con la palabra reservada 'in', para establecer el tamaño del incremento o decremento se hace uso de la palabra reservada 'step', para asignar el rango se puede usar la palabra reservada 'until' en caso de ser menor estricto o '..' en caso de ser menor-igual
for (i in 1 until 11) {println(i) }
for (i in 1..10 step 2) {println(i)}
1 2 3 4 5 6 7 8 9 10 1 3 5 7 9
null
Kotlin posee gran cantidad de clases para administrar colecciones de datos, entre las mas destacadas estan
ByteArray ShortArray LongArray FloatArray DoubleArray BooleanArray CharArray
ArrayList:
A diferencia de los arreglos normales no maneja índices ni posee un tamaño definido, se utiliza para cualquier tipo de dato y se caracterizan por ser inmutables
fun main(args: Array<String>) {
var lista1: List<String> = listOf("lunes", "martes", "miercoles", "jueves", "viernes", "sábado", "domingo")
}
null
Listas Mutables:
No es necesario asignar un tipo de dato, dado que pueden almacenar cualquier tipo de variable, la asignación se realiza con ayuda de la palabra reservada 'mutablelistOf'
fun main(args: Array<String>) {
val edades: MutableList<Int> = mutableListOf(23, 67, 12, 35, 12)
}
null
Map-MutableMap:
Se utilizan como los diccionarios de python, funcionan mediante tuplas se compone de una clave y un valor asignado a dicha clave, el subindice puede ser cualquier tipo de clase.
//Map inmutable
fun main(args: Array<String>) {
val paises: Map<String, Int> = mapOf( Pair("argentina", 40000000),
Pair("españa", 46000000),
Pair("uruguay", 3400000))
}
//Map mutable
data class Producto(val nombre: String, val precio: Float, val cantidad: Int)
fun cargar(productos: MutableMap<Int, Producto>) {
productos[1] = Producto("Papas", 13.15f, 200)
productos[15] = Producto("Manzanas", 20f, 0)
productos[20] = Producto("Peras", 3.50f, 0)
}
null
MutableSet:
Permiten almacenar un conjunto de datos, los cuales deben ser todos de diferentes y no poseen un orden especifico
fun main(args: Array<String>) {
val conjunto1: MutableSet<Int> = mutableSetOf(2, 7, 20, 150, 3)
}
null
Set:
data class Fecha(val dia: Int, val mes: Int, val año: Int)
fun main(args: Array<String>) {
var feriados: Set<Fecha> = setOf(Fecha(1, 1, 2017),
Fecha(25, 12, 2017))
}
null
En Kotlin una función es un conjunto de instrucciones que resuelven un problema específico del código, se divide un problema en problemas más pequeños y las funciones se encargan de solucionar estos subproblemas. Las funciones se declaran con la palabra reservada 'fun' y su algoritmo se coloca entre llaves. Una función puede tener parametros para obtener datos, igualmente puede retornarlos con el uso de la palabra reservada 'return' para establecer el tipo de dato que retornara, este se adiciona al final de la declaración
fun cargarSumar() {
val valor1 = 4
val valor2 = 8
val suma = valor1 + valor2
println("La suma de los dos valores es: $suma")
}
fun mostrarMayor(v1: Int, v2: Int, v3: Int) {
print("Mayor:")
if (v1 > v2 && v1 > v3)
println(v1)
else
if (v2 > v3)
print(v2)
else
print(v3)
}
fun retornarSuperficie(lado: Int): Int {
val sup = lado * lado
return sup
}
null
Una clase es una plantilla de la cual se pueden crear múltiples objetos, ésta define propiedades y métodos. Un objeto es una entidad independiente que posee sus propios datos y programación. Antes de crear un objeto se debe crear la clase, al crear un objeto de una clase se crea una instancia de la misma.
class Persona {
var nombre: String = ""
var edad: Int = 0
fun inicializar(nombre: String, edad: Int) {
this.nombre = nombre
this.edad = edad
}
fun imprimir() {
println("Nombre: $nombre y tiene una edad de $edad")
}
fun esMayorEdad() {
if (edad >= 18)
println("Es mayor de edad $nombre")
else
println("No es mayor de edad $nombre")
}
}
fun main(parametro: Array<String>) {
val persona1: Persona
persona1 = Persona()
persona1.inicializar("Juan", 12)
persona1.imprimir()
persona1.esMayorEdad()
val persona2: Persona
persona2 = Persona()
persona2.inicializar("Ana", 50)
persona2.imprimir()
persona2.esMayorEdad()
}
null
Una de las características de Kotlin es que permite definir un objeto de manera inmediata sin necesidad de declarar una clase con ayuda de la palabra reservada 'object' y entre llaves se definen sus métodos y propiedades
object Matematica {
val PI = 3.1416
fun aleatorio(minimo: Int, maximo: Int) = ((Math.random() * (maximo + 1 - minimo)) + minimo).toInt()
}
fun main(parametro: Array<String>) {
println("El valor de Pi es ${Matematica.PI}")
print("Un valor aleatorio entre 5 y 10: ")
println(Matematica.aleatorio(5, 10))
}
null
Se puede realizar una llamada a un método desde otro método de la misma clase.
class Operaciones {
var valor1: Int = 0
var valor2: Int = 0
fun cargar() {
print("Ingrese primer valor:")
valor1 = readLine()!!.toInt()
print("Ingrese segundo valor:")
valor2 = readLine()!!.toInt()
sumar()
restar()
}
fun sumar() {
val suma = valor1 + valor2
println("La suma de $valor1 y $valor2 es $suma")
}
fun restar() {
val resta = valor1 - valor2
println("La resta de $valor1 y $valor2 es $resta")
}
}
fun main(parametro: Array<String>) {
val operaciones1 = Operaciones()
operaciones1.cargar()
}
null
En la programación orientada a objetos se hace uso de la colaboración entre clases, para ello utilizamos los métodos de dos clases diferentes para solucionar un problema común, esto se logra llamando una clase desde otra.
class Dado {
var valor:Int
constructor(value: Int){
valor = value
}
fun tirar() {
valor = ((Math.random() * 6) + 1).toInt()
imprimir()
}
fun imprimir() {
println("Valor del dado: $valor")
}
}
class JuegoDeDados {
val dado1 = Dado(1)
val dado2 = Dado(1)
val dado3 = Dado(1)
fun jugar() {
dado1.tirar()
dado2.tirar()
dado3.tirar()
if (dado1.valor == dado2.valor && dado2.valor == dado3.valor)
println("Ganó")
else
print("Perdió")
}
}
fun main(parametro: Array<String>) {
val juego1 = JuegoDeDados()
juego1.jugar()
}
null
Una de las principales propiedades de la programación orientada a objetos es el encapsulamiento, éste consiste en agrupar de manera organizada una serie de métodos dentro de una clase, ésto evita que se acceda a los datos por un medio diferente, ésto garantiza la integridad de los datos. Kotlin asigna cada método como 'public' por defecto, para que sólo se pueda acceder a un método desde una clase determinada se define con el modificador 'private'
class Operaciones {
private var valor1: Int = 0
private var valor2: Int = 0
fun cargar() {
valor1 = 6
valor2 = 14
sumar()
restar()
}
private fun sumar() {
val suma = valor1 + valor2
println("La suma de $valor1 y $valor2 es $suma")
}
private fun restar() {
val resta = valor1 - valor2
println("La resta de $valor1 y $valor2 es $resta")
}
}
fun main(parametro: Array<String>) {
val operaciones1 = Operaciones()
operaciones1.cargar()
}
null
Data Class:
El lenguaje Kotlin provee una estructura llamada Class Data cuya finalidad es almacenar un conjunto de datos sin necesidad de implementar funcionalidades, para la declaración se antecede la palabra reservada 'data' y en el constructor se definen las propiedades que va a almacenar la clase. Para acceder a un método de la clase utilizamos la palabra clave 'override'
data class Persona(var nombre: String, var edad: Int) {
override fun toString(): String {
return "$nombre, $edad"
}
}
fun main(parametro: Array<String>) {
var persona1 = Persona("Juan", 22)
var persona2 = Persona("Ana", 59)
println(persona1)
println(persona2)
}
null
Enum Class
Es una estructura utilizada para definir un grupo de constantes, se declara de la misma manera que Data Class anteponiendo la palabra reservada 'Enum' y se definen cada una de las posibles constantes que se pueden guardar en ella, al igual que las demás clases éstas pueden tener propiedades definidas en el constructor.
enum class TipoCarta{
DIAMANTE,
TREBOL,
CORAZON,
PICA
}
class Carta(val tipo: TipoCarta, val valor: Int) {
fun imprimir() {
println("Carta: $tipo y su valor es $valor")
}
}
fun main(parametro: Array<String>) {
val carta1 = Carta(TipoCarta.TREBOL, 4)
carta1.imprimir()
}
null
A diferencia de la colaboración entre clases que se explicó previamente, la herencia es la creación de nuevas clases partiendo de unas ya existentes, que tendrá las mismas propiedades de la clase padre y algunas propias. Las clases heredadas son aquellas que están en una clase mayor por ejemplo la clase círculo es una figura, por lo tanto se hereda de la clase figura. Para que una clase sea heredable en Kotlin se debe colocar la palabra reservada 'open' antes de declarar la clase. La herencia la indicamos después de los dos puntos indicando el nombre de la clase de la cual heredamos y pasando inmediatamente los datos del constructor de dicha clase
open class Persona(val nombre: String, val edad: Int) {
open fun imprimir() {
println("Nombre: $nombre")
println("Edad: $edad")
}
}
class Empleado(nombre: String, edad: Int, val sueldo: Double): Persona(nombre, edad) {
override fun imprimir() {
super.imprimir()
println("Sueldo: $sueldo")
}
fun pagaImpuestos() {
if (sueldo > 3000)
println("El empleado $nombre paga impuestos")
else
println("El empleado $nombre no paga impuestos")
}
}
fun main(parametro: Array<String>) {
val persona1 = Persona("Jose", 22)
println("Datos de la persona")
persona1.imprimir()
val empleado1 = Empleado("Ana", 30, 5000.0)
println("Datos del empleado")
empleado1.imprimir()
empleado1.pagaImpuestos()
}
null
Cuando se tienen un conjunto de métodos y operaciones que hacen parte de diferentes clases, Kotlin permite generar una clase abstracta cuya función es agrupar dicho conjunto. Una clase abstracta no puede definir objetos, pero podrá ser heredada por otras clases que si puedan definirlos. La palabra 'abstract' se utiliza para definir la clase y para obligar a las clases que heredan ésta, seguir la misma implementación de los métodos.
abstract class Operacion(val valor1: Int, val valor2: Int) {
protected var resultado: Int = 0
abstract fun operar()
fun imprimir() {
println("Resultado: $resultado")
}
}
class Suma(valor1: Int, valor2: Int): Operacion(valor1, valor2) {
override fun operar() {
resultado = valor1 + valor2
}
}
null
Declara una serie de métodos y propidades que deben ser implementados por las demas clases, diseñada para suplir la necesidad de herencia multiple, por ello utiliza la misma sintaxis que la herencia
interface Punto {
fun imprimir()
}
class PuntoPlano(val x: Int, val y: Int): Punto {
override fun imprimir() {
println("Punto en el plano: ($x,$y)")
}
}
class PuntoEspacio(val x: Int, val y: Int, val z: Int): Punto {
override fun imprimir() {
println("Punto en el espacio: ($x,$y,$z)")
}
}
fun main(parametro: Array<String>) {
val puntoPlano1 = PuntoPlano(10, 4)
puntoPlano1.imprimir()
val puntoEspacio1 = PuntoEspacio(20, 50, 60)
puntoEspacio1.imprimir()
}
null
Referencias:
https://www.tutorialesprogramacionya.com/kotlinya/index.php?inicio=0
https://fabiomsr.github.io/from-java-to-kotlin/index.html
kotlin para android https://youtu.be/P9ZFhTw2hGA
curso de kotlin https://devcode.la/cursos/kotlin/#clases/programacion-orientada-a-objetos/distribucion-del-codigo-fuente-en-kotlin
https://kotlinlang.org/docs/reference/classes.html
tutorial https://www.tutorialspoint.com/kotlin/index.htm
programación orientada a objetos con kotlin https://www.youtube.com/watch?v=zR92kdl21Ww
ejemplos github https://github.com/DevPicon/kotlin-examples/tree/master/src/la/devcode/kotlin
tutoriales básicos https://devcode.la/cursos/kotlin/#clases