Saltar a contenido

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 un String y 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 OutlinedTextField que 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).