Kotlin lambda
Lambdas
Funciones anónimas
- ¿ 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
¿ Entonces que son las funciones Lambda ?
son funciones anónimas que puede ser usadas como una expresión
button.addActionListener { println("Hi") }
- Lambda Syntax
{ x: Int, y: Int -> x + y }
|--Parametros--| |-Body-|
{ x: Int, y: Int -> x + y }
- Pasando una función Lambda como parámetro
list.any({ i: Int -> i > 0 })
Cuando la función Lambda es el último parámetro
esta puede ser movida fuera de los parentesis
list.any() { i: Int -> i > 0 }
- Y si los parentesis están vacios, estos se pueden omitir ( :) )
list.any { i: Int -> i > 0 }
Y si el tipo de argumento puede ser inferido
este se puede omitir. si es claro desde el contexto
list.any { i -> i > 0 }
- Y si el lambda tiene un solo argumento
list.any { it > 0 }
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
- 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 )
}
- ¿ 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 )
}
- ¿ 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 )
}
- ¿ 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 )
}
- ¿ 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 )
}
- ¿ 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 )
}
- ¿ 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 } )
}
- ¿ 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 } )
}
- ¿ 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))
}
- ¿ 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)
}
- ¿ 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)
}