Saltar al contenido principal

Programación funcional en Java

La programación funcional en Java fue mejorada significativamente a partir de la versión Java 8, con la introducción de características clave como expresiones lambda, la Functional Interface y la API de flujos (Streams API).

Estos elementos facilitan el uso de un paradigma funcional, donde las funciones son tratadas como ciudadanos de primera clase, permitiendo un código más declarativo, modular y eficiente.

Ciudadanos de primera clase

En programación, se dice que una entidad es de primera clase (first-class citizen) cuando puede tratarse como cualquier otro valor del lenguaje.

Esto significa que se pueden:

  • Asignar a variables.
  • Pasar como argumento a métodos.
  • Devolver como resultado de un método.
  • Almacenarse en estructuras de datos (listas, mapas, etc.).

En la programación funcional, el concepto se aplica principalmente a las funciones. Decir que “las funciones son ciudadanos de primera clase” significa que las funciones pueden manejarse como valores normales: puedes pasarlas, devolverlas o guardarlas.

En el contexto de Java

Históricamente, en Java las funciones no eran ciudadanos de primera clase, porque todo debía estar dentro de una clase y no se podían pasar métodos directamente como parámetros.

A partir de Java 8, esto cambió gracias a las expresiones lambda y a las interfaces funcionales (Function, Predicate, Consumer, etc.).

Esto permite tratar a las funciones como objetos y, por tanto, como ciudadanos de primera clase.

Ejemplo

import java.util.function.Function;

public class Main {
public static void main(String[] args) {
// Asignar una función a una variable
Function<Integer, Integer> cuadrado = x -> x * x;

// Pasar una función como parámetro
aplicarYMostrar(5, cuadrado);

// Devolver una función desde un método
Function<Integer, Integer> triple = crearMultiplicador(3);
System.out.println(triple.apply(4)); // 12
}

static void aplicarYMostrar(int valor, Function<Integer, Integer> funcion) {
System.out.println(funcion.apply(valor));
}

static Function<Integer, Integer> crearMultiplicador(int factor) {
return x -> x * factor;
}
}

En el código anterior:

  • Function<Integer, Integer> representa una función.
  • Las funciones se guardan en variables, se pasan como argumentos y se utilizan como valor de retorno de métodos.
  • Por tanto, Java trata las funciones como ciudadanos de primera clase (desde Java 8 en adelante).