Kotlin lambda

Lambdas

Funciones anónimas

  1. ¿ Por qué se llaman funciones anónimas ?

1.1 Como es en Java


button.addActionListener(new ActionListener(){

    @Override
    public void actionPerformed(ActionEvent e){
        System.out.println("Hi");
    }

});

Lambdas

  1. ¿ Entonces que son las funciones Lambda ?

    son funciones anónimas que puede ser usadas como una expresión


button.addActionListener { println("Hi") }
  1. Lambda Syntax

 { x: Int, y: Int -> x + y }

 |--Parametros--|   |-Body-|  

 { x: Int, y: Int -> x + y }
  1. Pasando una función Lambda como parámetro

list.any({ i: Int -> i > 0 })
  1. Cuando la función Lambda es el último parámetro

    esta puede ser movida fuera de los parentesis


list.any() { i: Int -> i > 0 }
  1. Y si los parentesis están vacios, estos se pueden omitir ( :) )

list.any { i: Int -> i > 0 }
  1. Y si el tipo de argumento puede ser inferido

    este se puede omitir. si es claro desde el contexto


list.any { i -> i > 0 }
  1. Y si el lambda tiene un solo argumento

list.any { it > 0 }
  1. Si necesitas expresar alguna logica más complicada

    puedes usar Multi-line Lambda

    La última expresión es el resultado


list.any { 

    println("processing $it")

    it > 0 

}

Common Operations on collections

  1. Encuentra el resultado de está expresión

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.last().name )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.firstOrNull { it.age == 30 }?.name )

    //println( heroes.first { it.age == 30 }.name )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.map { it.age }.distinct().size )



}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.filter { it.age < 30 }.size )



}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    val (youngest, oldest) = heroes.partition { it.age < 30 }

    println( oldest.size )

    println( youngest.size )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.maxBy { it.age }?.name )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.all { it.age < 50 } )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    println( heroes.any { it.gender == Gender.FEMALE } )

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    val mapByAge: Map<Int, List<Hero>> = 

  heroes.groupBy { it.age }

val (age, group) = mapByAge.maxBy { (_, group) -> 

  group.size

}!!

println(age))

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

    val mapByName: Map<String, Hero> = heroes.associateBy { it.name }

    println(mapByName["Frenchy"]?.age)

}
  1. ¿ Cual es el resultado ?

data class Hero(

    val name: String,

    val age: Int,

    val gender: Gender?

)



enum class Gender { MALE, FEMALE }



val heroes = listOf(

    Hero("The Captain", 60, Gender.MALE),

    Hero("Frenchy", 42, Gender.MALE),

    Hero("The Kid", 9, null),

    Hero("Lady Lauren", 29, Gender.FEMALE),

    Hero("First Mate", 29, Gender.MALE),

    Hero("Sir Stephen", 37, Gender.MALE))



fun main(){

   val (first, second) = heroes

        .flatMap { heroes.map { hero -> it to hero } } 

        .maxBy { it.first.age - it.second.age }!!

    println(first.name)

}