Funciones en Kotlin¶
Funciones¶
Una función encapsula un bloque de código que realiza una tarea específica. Permite estructurar el programa en partes más legibles, reutilizables y mantenibles.
En Kotlin, las funciones se declaran con la palabra clave fun.
Funciones con parámetros¶
Una función puede recibir datos a través de parámetros. Esto la hace más flexible y reutilizable.
fun mostrarMensaje(texto: String) {
println(texto)
}
fun main() {
mostrarMensaje("Bienvenido al programa de ejemplo")
val a = 5
val b = 7
val suma = a + b
println("La suma de $a + $b = $suma")
mostrarMensaje("Gracias por utilizar nuestra aplicación")
}
Funciones con retorno de datos¶
Además de recibir datos, una función puede devolver un resultado mediante la palabra clave return.
fun calcularSuperficie(lado: Int): Int {
return lado * lado
}
fun main() {
val lado = 4
val superficie = calcularSuperficie(lado)
println("La superficie de un cuadrado de lado $lado es $superficie")
}
En Kotlin, si la función tiene una sola expresión, puede simplificarse así:
fun calcularSuperficie(lado: Int) = lado * lado
Funciones con parámetros con valor por defecto¶
Kotlin permite asignar valores por defecto a los parámetros, lo que simplifica llamadas repetitivas.
fun saludar(nombre: String = "visitante") {
println("Hola, $nombre ")
}
fun main() {
saludar("Ginés")
saludar() // Usa el valor por defecto
}
Funciones con argumentos nombrados¶
En Kotlin se pueden pasar los argumentos especificando el nombre del parámetro, lo que da más claridad y permite alterar el orden.
fun mostrarUsuario(nombre: String, edad: Int, ciudad: String) {
println("Usuario: $nombre, Edad: $edad, Ciudad: $ciudad")
}
fun main() {
// Llamada normal
mostrarUsuario("Lucía", 25, "Alicante")
// Llamada con argumentos nombrados (en otro orden)
mostrarUsuario(edad = 30, ciudad = "Valencia", nombre = "Carlos")
}
Funciones internas o locales¶
Kotlin admite funciones definidas dentro de otras funciones. Estas funciones solo son accesibles dentro del ámbito donde se declaran.
fun procesarNumeros() {
fun esPar(numero: Int): Boolean = numero % 2 == 0
for (i in 1..5) {
println("$i es par: ${esPar(i)}")
}
}
fun main() {
procesarNumeros()
}
Integración con Jetpack Compose¶
A modo de práctica moderna, podemos integrar estas funciones en una interfaz Compose:
@Composable
fun SumaInteractiva() {
var num1 by remember { mutableStateOf("") }
var num2 by remember { mutableStateOf("") }
var resultado by remember { mutableStateOf<Int?>(null) }
fun sumar(a: Int, b: Int) = a + b
Column(
modifier = Modifier
.fillMaxSize()
.padding(24.dp),
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Text("Calculadora de suma", style = MaterialTheme.typography.titleLarge)
OutlinedTextField(
value = num1,
onValueChange = { num1 = it },
label = { Text("Primer número") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
OutlinedTextField(
value = num2,
onValueChange = { num2 = it },
label = { Text("Segundo número") },
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number)
)
Button(
onClick = {
val a = num1.toIntOrNull() ?: 0
val b = num2.toIntOrNull() ?: 0
resultado = sumar(a, b)
},
enabled = num1.isNotBlank() && num2.isNotBlank()
) {
Text("Calcular")
}
resultado?.let {
Text("Resultado: $it", style = MaterialTheme.typography.bodyLarge)
}
/* Para no confundir con lo de arriba
if (resultado != null) {
Text("Resultado: $resultado", style = MaterialTheme.typography.bodyLarge)
}
*/
}
}
Actividades¶
A tener en cuenta
Todas las actividades y práctias deberán implementar una interfaz gráfica.
-
AC 401 (RA2 / CE2a / IC1 / 1p). Implementa una función
mostrarNombre()que reciba unStringy lo muestre. -
AC 402 (RA2 / CE2a / IC1 / 1p). Crea una función
calcularPromedio(a, b, c)que devuelva el promedio de tres números. -
AC 403 (RA2 / CE2a / IC1 / 1p). Diseña una app Compose con un
OutlinedTextFieldque use una función para validar si un número es múltiplo de 5. -
AC 404 (RA2 / CE2a / IC1 / 1p). Implementa una función local en Compose que formatee el nombre del usuario (primera letra mayúscula).