Estas son mis notas del curso que yo hice desde mi perspectiva en la que ya se programar en java es por esto que si sbaes Java te recomineod leerlas ya que muestran como es kotlin desde un enfoque no dirigido a gente que no programa
Espero que les sirva 😃
Kotlin
General
Kotlin es un lenguaje basado en java, fue creado por jetbrains (los creadores de Android studio) kotlin usa el jvm, es decir que si hacemos un código java y un kotlin que hacen lo mismo, su bytecode sería exactamente igual. Por esto mismo kotlin puede “incrustar” java en su código por esto también puede usar sus librerías.
Operadores
En kotlin se usan objetos en vez de datos primitivos, por lo mismo en vez de operadores se utilizan más métodos que actúan de un modo similar.
.unaryMinus() multiplica el número por (-1)
.unaryPlus() multiplica el número por 1
a.(operación)Assign(b) asigna el valor de la a(operación)b Ej:
a.plusAssign(b) equivale a: a = a +b
.not()asigna el valor opuesto true a false y false a true
a.or(b) indica si alguno de a o b es true
a.and(b) indica si a y b son ciertos
.inc() suma 1
.dec() resta 1
La función a.compareTo(b) devuelve 1 si a > b, 0 si a = b, -1 si a < b.
Por lo tanto para tener un booleano como resultado hay que compararlo con 0
.equals() retorna un booleano sobre la igualdad. Lo que la maestra pone sobre los ? : b === null sirve para prevenir que alguna de las dos variable(a o b) sea nula y genere un error
Tipos de variables
(changeables)
var: tipo de variable que puede ser modificada
(unchangeables)
val: se define en tiempo de ejecución
Puede ser definir por datos externos o el usuario
const val: se define en tiempo de compilación
Se define en hardcode , es decir está escrito en el código y lo define el programador
Strings
Kotlin es débilmente tipado, sin embargo es posible especificar el tipo de dato con val nombre : tipo
. Esto es una buena práctica ya que es una de las bases de la programación funcional .
En kotlin no es necesario concatenar directamente con “+” para concatenar más bien vamos a agregar la variable dentro del string con $variable
con"""""", es decir triple comillas podemos hacer un párrafo. Debemos agregar .trimIdent()
al final para que la indentación dentro del párrafo escrito se respetetrimMargin() //ignora todos las cadenas de caracteres que le pasemos de parámetro
Caracteres de escape:
Respuesta a:
Strings\t //Tabula \b //Retrocede el cursor de texto 1 carácter \n //Crea un salto de línea \r //Mueve el cursor de texto al inicio de la línea en la que está \’ //Te permite usar los caracteres \" \\ \$
Rangos
Los rangos en kotlin son una especie de estructura de dato que contiene los valores que le demos con el operador … , esto también se puede hacer con.rangeTo()
El operador in
nos indica si un valor se encuentra dentro del rango.
ES por esto el bucle for funciona iterando i y cuando i forma parte del rango se ejecuta la impresión
If y when
En kotlin los if son básicamente iguales a la mayoría de lenguajes
Los when son muy similares a switch se utilizan con rangos principalmentes por ejemplo:
when(variable a checar){
in 1…10 -> procedimiento a seguir
}
Bucles
Los bucles do y do while tienen la misma sintaxis que en java.
For es como un foreach en java, recorre los elementos de una colección lista, arreglos, etcétera.
Se instancia del modo
for((objeto a iterar) in (colección) ){
}
también tenemos foreach que es un método implementado en las listas en las listas y colecciones y agregaremos un bloque de código para ello
colección.foreach{
//bloque a ejecutar
}
Continue y break se usan igual que en java.
Label nos ayuda a usar break y continue de una manera más específica
@nombreDelLabel for(…){
……
break@nombreDelLabel
}
Es especialmente útil en bucles anidados
Valores nulos
Kotlin es null safety es decir que no lanza excepciones a los valores nulos para evitar excepciones con la posibilidad de que un valor sea nulo se usa el operador ?
El double bang !! fuerza a que se lance la excepción para que pueda ser manejadacon un trycatch. Esto es porque si no lo ponemos kotlin no compilara y no se ejecutara. NO es una buena práctica
Operador Elvis ( ?: )
EL operador Elvis nos sirve como una especie de operador ternario en donde la parte lógica en vez de ser definida por nosotros valida que que no sea nulo ej:
// a.getData puede ser nulo // .dataSize() regresa el tamaño del los datos //.showNullCase() retorna 0 en caso de no haber datos
a.getData()?.dataSize() ?: .NullCase()
En este caso el primer ? identifica si .getData() es nulo, si es nulo hara lo que esta después del operador Elvis ( ?
Arrays
En kotlin los arreglos son muy similares a java
se pueden instanciar de distintos modos dependiendo si quieres que el tipo de dato sea inferido o definido por ti:
También tienen muchos de los métodos que tienen los de java
val name = arrayOf(1,2,3,4,5) // el tipo de dato se infiereval name: IntArray = intArrayOf(1,2,3,4,5) /* este caso solo sirve para datos "primitivos" charArray, booleanArray, IntArray, etcetera*/val name: Array<String> = arrayOf<String>("este", "es un" ,"arreglo") //debes indicar el tipo de dato que almacenará
Métodos útiles
toIntArray()
convierte un arreglo de a IntArray
sum()
suma los valores dentro del arreglo
plus()
añade un nuevo elemento al arreglo
reversedArray()
devuelve un arreglo con los elementos invertidos del arreglo dado
reverse()
invierte el orden de los elementos en un arreglo
Funciones
las funciones se definen con la palabra reservada fun. Ej:
funname(){
}
En kotlin todas las funciones devuelven un valor, por defecto ese valor es Unit. EN Kotlin Unit es la nada, es similar a void en java
Para definir el tipo de dato de retorno de una función se hará así:
funname(parameters): type {
returntype
}
las funciones se llaman exactamente igual que en java
Parámetros por defecto
En kotlin existe algo maravilloso: podemos instanciar los parámetros por defecto y si nos es especificado sera el valor por defecto.
Esto nos genera un problema: como sara el compilador cual parámetro es el que no pones, para esto hay 2 soluciones:
named and positioned arguments
Cuando es positioned deberás dar los parámetros en el orden que se dan al declarar la función. Ej:
fun funcion1 (param1: Int = 0, param2: String = “a”){
}
funcion1(3)
En este caso se pueden usar los por defectos solo si estan todos al final (el segundo parametro sera a)y kotlin inferir que los primero son para los primeros.
naming consiste en darle el nombre del parámetro que estamos declarando. Ej:
fun funcion2 (param1: Int = 1, param2: Boolean = true){
}
funcion2(param2 = false)
En este otro caso kotlin sabe a cual te refieres porque se lo indicas(el primer parámetro queda por defecto) y deberás indicar los que quieras usar
Ojo: es importante no combinar las dos técnicas ya que dará error
Lambdas
Las lambdas al igual que en java son funciones anónimas, sin nombre.
Se declaran del siguiente modo:
{(sentencias)}()
También podemos asignar una lambda a una variable:
val funcion = {(sentencias)}()
funcion()
Para que la lambda reciba parámetros se hace similar a java:
val a = {param1: Int, param2 : Int -> (expresiones)}
a(3 , 1)
si no es necesario asignarla a una variable tenemos la siguiente sintaxis:
{param1: Int, param2 : Int -> (expresiones)}(3, 8)
Si en una variable guardamos una función, la variable tendrá el valor que retorna la función o Kotlin.Unity en su caso.
Si lo almacenamos como lambda la variable “guardara la sintaxis” de la lamba por asi decirlo
Programación orientada a objetos
Clases
Las clases se declaran al igual que en java con la palabra class.
Cada clase tiene atributos y variables.
Las clases sirven para crear objetos, la base de este paradigma.
Modificadores de acceso en kotlin
En kotlin el modificador por defecto es public
En kotlin también se usan private protected y public conj las mismas restricciones
También se usa internal para el acceso entre módulos
En kotlin también se usan getters y setters
sinaxis.(modificador) (var/val/const) (name)
Get() y Set()
Son como getters y setter establecidos por el propio kotlin que podremos usar en valores no encapsulados
Esto nos sirve para poder tener validaciones
Se crean así:
val a = 10
set(value){
field = value/* se usa field para referirse al valor seteado*/
}
get() = field // usamos igual en vez de {} porque no hacemos validacion
y se usan solos al momento de usar el atributo tan simple como asi:
clase.a = 12/* esto servirá porque dentro del set podemos colocar validaciones */
Data Class
Los data class son un tipo de clase en kotlin que nos sirven para manejar datos especialmente externos, mapearlos y convertirlo en algo que podamos usar en nuestro programa
Los data clas se definen así :
data class Movie(parámetros)
Los data class deben tener un constructor
Constructores en Kotlin
Hay 2 primario: forma clásica de iniciar una clase
secundario: cuando ponemos una inicialización
Un constructor primario se hace poniendo parentesis despues del nombre de la clase
classMovie(parámetros){
}
Las variables que creemos en los parámetros tambien se crearan en la clase
Initializer blocks ejecutan lo que esté dentro al crear el objeto
init{
(sentencias)}
Constructor
Esto es básicamente lo mismo que se hace en java
constructor(){
}
Herencia y polimorfismo
Así como en java todas las clases heredan de object en kotlin todas las clases heredan de "Any"
Any tiene 3 métodos: equals, hashCode y toString
La manera para heredar en kotlin es la siguiente :
classNombreDeLaClase(): ClasePadre() {
override funtoString(): String { //sobrescribiendo toString
returnsuper.toString()
}
}
Para sobrescribir se usa override (polimorfismo)
Abstracción
En Kotlin las clases abstractas se usan igual que en los otros lenguajes del paradigma POO, se usa la palabra clave abstract al igual que en Java. Otra manera de verlo es como una clase más genérica de la que no crearemos objetos. Al usar abstract el “open” queda implícito así que no hay que ponerlo
Interfaces
Las interfaces las utilizaremos cuando la parte del código redundantes son los métodos y funciones
Las abstractas para los atributos que son iguales entre clases
Se dice que las clases abstractas son los padres de las jerarquías y las interfaces se implementan en distintas "familias"
para implementar en kotlin se usara una coma:
classCoolClass(): Any(), IWatchable{}
classCoolClass2, IPlayable{}
En el primer ejemplo hay herencia y constructor aparte de interfaz Para poner implementación de los métodos en interfaz (default en java) solo hay que poner las llaves no es necesario indicar nada
Programación Funcional
Funciones de orden mayor
Las funciones de orden mayor son el mismo concepto en java y en kotlin,
para dar una función como parámetro utilizaremos los ::
funcion(parametros,::funcion2)// para no dar parámetros
para ponerlo en la declaración de la función usaremos una lambda con los tipos de dato de entrada y salida
List , Filter
Las listas pueden ser de un solo tipo de dato o de Any es decir de múltiples tipos de dato.
Las podemos crear como
val lista1 = listOf(e1,e2,e3)
Filter es un método que recibe una lambda, nos devolverá una nueva lista con los elementos que cumplan la lambda (también puede ser una expresión lógica)
Usaremos it como una especie de .foreach() en java, para iterar todos los elementos de la lista.
Estas fueron mis notas, sin mas me despido y espero que les sea de ayuda