Van icon

KOTLIN Basics

Links


    //KOTLIN
    no semicolons
    Staticlly typed ?
    // Comments

    file.kt

    fun main (){
        birthdayGreeting
        println("Hello Kotlin")
        print("Hello Kotlin")
        print("Hello Kotlin")
    }

    fun birthdayGreeting() {
    println("Happy Birthday, Rover!")
    println("You are now 5 years old!")
    }
    


    // VARIABLES
    val: read-only
    var: read and write
    const val (no en modo local)

    val firstName: String = "Alb"
    val firstName: Char = "a"
    val firstName = "Alb"
    var weight = 160
    var myVariable: Double = 2.5
    var myVariable: Float = 2.54f
    var myVariable: Int = 4
    var trueFalse: Boolean = false

    saldo.toString()

    NULL
    val instagramBio: String? = null // ? allows null
    if (instagramBio != null){
        println(instagramBio.toUpperCase())
    }
    println(instagramBio?.toUpperCase())
    
    Double 64,    Float 32,    Long 64,     Int 32,     Short 16,    Byte 8
    


    // GENERAL 
    OPERATORS     + val combined = "Al" + "Tor"

    PRINT 
    val myString = "Kotlin"     println(myString)
    println("the String is $myString")


    METHODS
    println(myString[0])
    println(myString[1])
    println(myString.isEmpty())
    println(myString.length)
    println(myString.substrings(2,4))


    // CONDITIONALS

    val examScore = 88
    if (examScore > 79) {
        println("you pass")
    } else {}

    LOOP
    for (name in names){
        print(name)
    }
    for (i in 1..5){ // (1 until 5)
        print(name)
    }
    
    when(mes)
        1,2,3 -> printl("invierno")

    
    do(){

    }while()

    while(){}

    if() break
    


    //COLLECCIONES
    arrays. tamaño fijo
    sets: no duplicados, desordenadas, no indice
    lists: ordenadas, insercion eliminacion
    maps: pares clave valor, unicidad, sin orden

    //ARRAYS
    var recibos: Array<String> = arrayOf("luz","agua","gas")

    MATRIZ // 1 =0,0; 6 = 1,2
    var matriz = ArrayOf(
        intArrayOf(1,2,3)
        intArrayOf(4,5,6)
        intArrayOf(7,8,9,10,11)
    )



    //SETS
    var clientesVIP: Set<Int> = setOf(1234,5678,1402)
    var setMezclado = setOf(2,5.24,"casa")
    clientesVIP.size clientesVIP.contains(1234)

    MUTABLES (se pueden añadir o cambiar nuevos)
    var clientes: MutableSet<Int> = mutableSetOf(1234,5678,1402)
    clientes.add clientes.remove clientes.clear clientes.size



    //LISTS
    var divisas: List<String> = listOf("USD", "EUR", "YEN")
    var divisas: List<String> = mutableListOf("USD", "EUR", "YEN")
    se puede recorrer
    divisas.removeAt(indice) divisas.add

    Several:
    val names = listOf("Ali", "Maya", "Chen")
    names[2]
    val names = mutableListOf("Ali", "Maya", "Chen")
    names.add("Albert")



    //MAP (usado para bases de datos)
    var mapa: Map<Int, String> = mapOf(
        1 to "España",
        2 to "Mexico",
        3 to "USA"
    ) //SystemOut {1=España, 2=Mexico, 3=USA}

    var inversiones = mutableMapOf<String, Float>(
    "nVidia" to 12.45f,
    "IMB" to 312.32f,
    "BTC" to 462.16f
    )
    
    


    // FUNCTIONS
    fun myFunction(name: String, age: Integer){
        println("hello $name")
    }

    myFunction("Jay")


    //UNIT FUNCTIONS, don't return
    fun birthdayGreeting(): String {  
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    }

    // retuurn functions
    fun birthdayGreeting(): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
    }


    fun birthdayGreeting(name: String): String {
    val nameGreeting = "Happy Birthday, Rover!"
    val ageGreeting = "You are now 5 years old!"
    return "$nameGreeting\n$ageGreeting"
    }
    


    // ANDROID
    onCreate() punto de entrada (es como el main())
    setContent()  - dentro de onCreate() define diseño con funciones que adminten composición. Todas las funciones con @Composable

    @Preview

    @Composable: convierte datos en UI
    @Composable 
    fun Greeting(name: String) {
    Text(text = "Hello $name!")
    }

    Column, Row y Box

    


    // LOOPS

    var recibos: Array<String> = arrayOf("luz","agua","gas")
    recorrer_array(recibos)
    LOOP
    for (name in names){
    print(name)
    }
    for (i in 1..5){ // (1 until 5)
    print(name)
    }

    fun recorrer_array(array: Array<String>){
        for (name in array) //name, i
        
        for (i in 1..5)// (1 until 5)
    
        for (i in array.indices)
        array.get(i)
    }

    for (i in (0 until matriz.size)){
        print(i)
        for(j in (0 until matriz[i].size)){
            print($matriz[i][j])
        }
    }

    i in 0 .. array.size -1


    // EJERCICIOS CURSO
    /** */
    
    fun main() {
    // cuentaRegresiva90()
    // recorrer110conpares()
    // recorrerArrayPlatos()
    // recorrerArrayPlatosconjuntoDatos()
    recorrerArrayPlatosconjuntoDatosyIngredientes()
    }
    
    /**1-Usa un bucle do-while para mostrar por pantalla una cuenta regresiva del 9 al 0 igual que cuando hay un lanzamiento
    de un cohete por parte de la NASA.
    Incluye tu código en la respuesta*/
    fun cuentaRegresiva90(){
    var number = 9
    do{
    println(number)
    number--
    }while(number >=0)
    }
    
    /** 2- Usa un bucle while para recorrer todos los números del 1 al 10 y mostrar únicamente los pares
    Incluye tu código en la respuesta*/
    fun recorrer110conpares(){
    var number = 0
    while (number <=10) { if(number%2==0) print(number) number++ } } /** 3-Usa un bucle for para recorrer un array en el que
        estén almacenados los diferentes platos que ofrece un restaurante y mostrarlos por pantalla Incluye tu código en la
        respuesta*/ fun recorrerArrayPlatos(){ val platos=arrayOf("carbonara", "pizza frita" , "marguerita" ) for (plato in
        platos) print(plato) } 
        
    /** 4-Crea el mismo ejercicio de antes pero ahora con un array de conjuntos de datos Cada
    elemento del array debe contener el nombre del plato y su precio*/ fun recorrerArrayPlatosconjuntoDatos(){ val
    platos=arrayOf( listOf("carbonara",10), listOf("pizza frita",6.6), listOf("marguerita",5.50) ) for (plato in platos)
    { println("${plato[0]} - ${plato[1]}€") } } 
        
    /**5-Crea el mismo ejercicio de antes pero añadiendo a cada conjunto de
    datos un array con los ingredientes de cada plato Ahora deberiamos tener la siguiente información de cada elemento
    del array principal: plato, precio, lista de ingredientes ADVERTENCIA: la idea NO es que toooooooooooooodos los
    ingredientes este en una unica string, sino que cada ingrediente sea una string */ fun
    recorrerArrayPlatosconjuntoDatosyIngredientes(){ val platos=listOf( listOf("carbonara",10,
    listOf("huevos","guanciale")), listOf("pizza frita",6.6, listOf("masa","mozzarella")), listOf("marguerita",5.50,
    listOf("mozzarella","pomodoro")) ) for (plato in platos) { val nombre=plato[0] as String val precio=plato[1] as
    Number val ingredientes=plato[2] as List<String>
    // println("${plato[0]} - ${plato[1]}€ - ingredientes: ")
    print("$nombre - $precio€ - Ingredientes: ")
    println(ingredientes.joinToString(", "))
    }


    }

    


    // OBJETOS
    class Person(var nombre: String = "Anonimo", var passport: String? = null) {
    var alive: Boolean = true
    
    fun die(){
    alive = false
    }
    }

    var hombre: Person = Person("Alb", "GJSN77")
    var anonimo: Person = Person()
    println(hombre.alive)
    hombre.die()


    class Pokemon(private var name: String = "Pok",
    var attackPower: Float = 30f,
    var life: Float = 100f) {
    
    fun Pokemon (n: String, aP: Float){
    this.name = n
    this.attackPower = aP
    this.life = 100f
    }
    
    fun getName(): String{
    return this.name
    }
    fun getattackPower(): Float{
    return this.attackPower
    }
    fun getLife(): Float{
    return this.life
    }
    fun setName(value: String){
    this.name = value
    }
    fun setattackPower(value: Float){
    this.attackPower = value
    }
    fun setLife(value: Float){
    this.life = value
    }
    }
    


    // HERENCIA
    open class Person(var name: String = "Anonimo", var passport: String? = null) {
    var alive: Boolean = true
    
    fun Person(){
    name = "Juan"
    passport = "BKOSFSU7"
    }
    fun die(){
    alive = false
    }
    }
    
    class Atleta(name: String, passport: String?, var sport: String): Person(name, passport) {
    
    }

    var atleta: Atleta = Atleta("Pele", "19238123", "futbol")
    


    // PUBLIC PROTECTED PRIVATE INTERNAL
    PUBLIC: Se puede acceder desde cualquier lado
    PRIVATE: Solo se puede acceder desde dentro. No heredable
    PROTECTED: No es público, es privado pero heredable por los hijos.
    INTERNAL: Para las funciones que permitan usar Protected. Para Get y Setters. Para el resto de una clase no es necesario
    


    // POLIMORFISMO
    Método de clase padre modificado en clase hijo. Varaciones de un método general. Se sobreescribe con override la función principal
    // debe ser una función open
    fun attack(){}
    override fun attack(){toast...}
    


    // SUPER
    USar la función del padre manteniendo el código pero cambiando o añadiendo ciertas cosas
    // debe ser una función open
    fun attack(){
        super.attack()  //se usa el método del padre tal cual
    } 
    


    // ABSTRACT CLASS
    No se van a hacer objetos de esa clase. Es para usar sus métodos y atributos
    abstract class Thanks(){
        fun thankscure(){Toast.make.... "Thanks !"}
    }

    open class Pokemon(): Thanks
    


    // INTERFACES
    Herencia multiple no posible en Kotlin/Java. Solo permite usar una clase de la que heredab
    Sin embargo se pueden usar multiples interfaces
    interface sayBye(){
        fun thankscure(){Toast.make.... "Bye !"}
    }
    open class Pokemon(): Thanks, sayBye


    // SUBCLASES
    class ClasePadre{
        privar var name: String = "Padre"
        fun saludo(): String {return name}

        class Anidada{
            private val nameAnidada = "Anidada"
            fun saludo(): String {return nameAnidada}
        }

        inner class Interna{
            privat val nameInterna = "Interna"
            fun saludo(): String {return "Hola soy ${this.nameInterna}", hija de ${name}}
        }
    }

    var padre = ClasePadre()
    padre.saludo()
    var ani = ClasePadre.Anidada() //Se crea un objeto de Anidada
    ani.saludo()
    var interna = CñasePadre().Interna()
    interna.saludo()
    


    // OBJETOS ANONIMOS
    fuera de funciones
    object persona{
        var apodo = "fer"
        fun saludo(){ println("Hola, me llaman ${apodo}")}
    }
    


    // DATA CLASS
    Atributos sin métodos
    Hay que especificar si es var o val
    data class star( val name: String = "",  val radius: Float = 0f, val galaxy: String = ""){
        var alive = true
    }

    var sol: star = star("Sol", 16.56f, "Via Láctea")

    //ENUM CLASS
    enum class dias{
        LUNES, MARTES, MIERCOLES, JUEVES, VIERNES, SABADO, DOMINGO;
    }
    var dia: dias = dias.MIERCOLES
    var semana = dias.values()
    for (i in semana){println(i)}


    // EJERCICIOS.

    open class Deportista(var nombre: String,var estatura: Float, var peso: Float, var edad: Int){
    fun Deportista (nombre: String, estatura: Float, peso: Float, edad: Int){
    this.nombre = nombre
    this.estatura = estatura
    this.peso = peso
    this.edad = edad
    }
    
    fun descansar(){}
    
    
    }
    
    
    class Runner(nombre: String, estatura: Float, peso: Float, edad: Int, var estilo: String): Deportista(nombre, estatura,
    peso, edad){
        fun Runner(nombre: String, estatura: Float, peso: Float, edad: Int, var estilo: String){
            this.nombre = nombre
            this.estatura = estatura
            this.peso = peso
            this.edad = edad
            this.estilo = estilo
        }
    fun correr(){}
    fun competir(){}
    
    }
    
    class Ciclista(nombre: String, estatura: Float, peso: Float, edad: Int, var tipoBici: String, var velocidad: Int):
    Deportista(nombre, estatura, peso, edad){
        fun Ciclista(nombre: String, estatura: Float, peso: Float, edad: Int, XXXX){
        this.nombre = nombre
        this.estatura = estatura
        this.peso = peso
        this.edad = edad
        }
    fun pedalear(){}
    fun competir(){}
    }
    
    class Nadador(nombre: String, estatura: Float, peso: Float, edad: Int, var estilo: String, var velocidad: Int):
    Deportista(nombre, estatura, peso, edad){
        fun Nadador(nombre: String, estatura: Float, peso: Float, edad: Int, XXXX){
        this.nombre = nombre
        this.estatura = estatura
        this.peso = peso
        this.edad = edad
        }
    fun nadar(){}
    fun competir(){}
    }
    
    var maradona: Deportista = Deportista("Digo Armando", 1.65f, 67.3f, 25)
    


    // FUNCIONES DE ORDEN SUPERIOR
    uso de fn (funcion) para incluir una función dentro de los parámetros de una función. 
    private fun calculadora(n1: int, n2: int, fn(int, int) -> int): Int{
        return fn(n1,n2)
    }
    private fun suma(x: int, y:int): Int { return x+y}
    private fun multiplica(x: int, y:int) = x*y

    calculadora(4,5,::suma)  //se envía usando dos :: + el nombre de la función

    //En Objetos
    Clase de ejemplo: 
    open class Person(var name: String = "Anonimo", var passport: String? = null) {
        var alive: Boolean = true
        
        fun Person(){
            name = "Juan"
            passport = "BKOSFSU7"
        }
        fun die(){alive = false}
        fun checkPolicia(fn: (Float)->Boolean):Boolean{ return fn(height)}
    }
    
    2 ejemplos: 1 dentro de la clase (arriba). 
    Funcion de orden superior en objeto
    private fun inColombia(h:Float): Boolean {
        if (h >=1.6f) return true
        else return false
    }

    private fun Person.checkPolice(fn: (Float)->Boolean):Boolean{ return fn(height)} // Si no es nuestra clase podemos crear función de extensión
    var ejemplo = Person("Jota", "A182348J")
    ejemplo.checkPolicia(::inColombia)

    class Atleta(name: String, passport: String?, var sport: String): Person(name, passport)
    var atleta: Atleta = Atleta("Pele", "19238123", "futbol")
    


    // LAMBDAS
    LAMBDAS {x: Int, y: Int -> x+y}
    Incluir una función dentro de una variable
    Función anónima que se envía como parámetro en una función de orden superior
    Se puede declarar fuera de los paréntesis
    Se puede acceder a código externo
    La función puede cambiar un bloque de código bajo el mismo nombre
    

    private fun calculadora(n1: int, n2: int, fn(int, int) -> int): Int{return fn(n1,n2)    }
    var funcion = {x: Int, y: Int -> x+y}
    calculadora(80,20, funcion)
    var funcion = {x: Int, y: Int -> x*y}

    Lambdas Funciones que mandamos a una función de orden superior pero son anónimas, no están guardadas en ninguna variable.
    calculadora(80,20, {x: Int, y: Int -> x+y})

    Lambda fuera del paréntesis. Funciona igual. También puede ir dentro
    calculadora(2,5)
        {x, y ->
            var valor = 1
        for (i in 1..y) valor *= x
        valor
        }

    calculadora(2,5,
    {x, y ->
    var valor = 1
    for (i in 1..y) valor *= x
    valor
    })

    Manipulación código en Lambda
    var array = intArray(10){5} //podría ser intArray(10, {5}) //Muestra array de números 5. INt array es una función de orden superior

    LAMBDA Parámetro IT que puede ser de distintos tipos: Iterador, View, Int...
    It es un parámetro que tiene una  Lambda por defecto. 
    En cada lamba puede haber un elemento distinto, un objeto, etc. Se puede cambiar el nombre.
    var array = intArray(10){it} //mostraría el array como 0,1,2...9
    var array = intArray(10){it*2} //mostraría el array como 0,2,4...18
    Cambiando nombre del parámetro
    var array = intArray(10){i* -> i*3} 

    Ejemplo de Lambda
    boton.setOnClickListener({      //it:View!
        fight(firePok,earthPok)     //necesario per view -> no es o se puede incluir
    })


    // Acceder a código externo
    Unit = Void ? Cuando la función no devuelve elemento
    private fun recorrerArray(array: IntArray, fn:(Int)-> Unit){
        for (i in array)
            fn(i)
    }
    var suma = 0
    recorrerArray(array){
        suma += it
    }



    


    //TYPEALIAS
    typealias aliasObjeto = 

    


    // TRY CATCH
    var trycatch = 
    try{
        println()
    }catch(e: Exception) {
        println("Error: se guarda una variable (e)de tipo exception")
    }finally{ 
        println("Ejecuta código siempre se haya o no producido el error")
    }

    private fun valuetry(){   }
    throw exception


    // OPERADOR ELVIS ?
    Para controlar los null

    var pais: String? = "Rusia"
    pais = pais.uppercase()?: "Desconocido"
    var pais: String? = Null
    pais = pais.uppercase()?: "Desconocido"


    //
    


    //
    


    //
    


    //
    


    //