A Programação Funcional (PF) é um paradigma de programação que foca em funções puras, imutabilidade, e a aplicação de transformações de dados de maneira declarativa. Kotlin, embora seja uma linguagem que suporta múltiplos paradigmas (incluindo orientado a objetos), possui muitas funcionalidades que facilitam a programação funcional. Vamos explorar os principais conceitos de programação funcional em Kotlin.

1. Funções Puras

Em programação funcional, funções puras são aquelas que:

Exemplo de função pura em Kotlin:

kotlin
Copiar código
fun somar(a: Int, b: Int): Int {
    return a + b  // A função sempre retorna a soma de a e b, sem efeitos colaterais
}

2. Imutabilidade

Na programação funcional, os dados são tratados como imutáveis, ou seja, não podem ser modificados após a criação. Em Kotlin, usamos val (para variáveis imutáveis) para garantir que os valores não possam ser alterados.

Exemplo:

kotlin
Copiar código
val lista = listOf(1, 2, 3)
// lista[0] = 4  // Erro: listas são imutáveis

Imutabilidade ajuda a evitar efeitos colaterais indesejados e facilita a compreensão do código.

3. Funções de Alta Ordem (Higher-Order Functions)

Como mencionei antes, uma função de alta ordem é uma função que recebe outra função como argumento ou retorna uma função. Funções de alta ordem são essenciais para a programação funcional, pois permitem compor funções e tratar operações de forma flexível.

Exemplo de função de alta ordem em Kotlin:

kotlin
Copiar código
fun <T> List<T>.meuFilter(predicate: (T) -> Boolean): List<T> {
    val resultado = mutableListOf<T>()
    for (item in this) {
        if (predicate(item)) {
            resultado.add(item)
        }
    }
    return resultado
}

val numeros = listOf(1, 2, 3, 4, 5)
val numerosPares = numeros.meuFilter { it % 2 == 0 }
println(numerosPares)  // Saída: [2, 4]

Aqui, a função meuFilter é uma função de alta ordem porque recebe uma função (predicate) como parâmetro.

4. Lambdas

As lambdas são funções anônimas que podem ser usadas como valores, passadas como parâmetros e aplicadas em coleções. Em Kotlin, as lambdas são amplamente usadas em programação funcional para operações como mapeamento, filtragem e redução de coleções.