Un problema con las clases anónimas es que si la implementación de su clase anónima es muy simple,
como una interfaz que contiene solo un método, entonces la sintaxis de las clases anónimas puede parecer
difícil de manejar y poco clara. En estos casos, por lo general,
intenta pasar la funcionalidad como argumento a otro método, como qué acción debe realizarse cuando alguien
hace clic en un botón. Las expresiones de Lambda le permiten hacer esto, para tratar la funcionalidad como
argumento de método o código como datos.
La sección anterior, Clases anónimas , le muestra cómo implementar una clase base sin darle un nombre.
Aunque esto a menudo es más conciso que una clase con nombre, para las clases con un solo método, incluso
una clase anónima parece un poco excesiva y engorrosa. Las expresiones Lambda le permiten expresar instancias
de clases de método único de forma más compacta.
# interfaz funcional
Una interfaz funcional es cualquier interfaz que contiene solo un método abstracto . (Una interfaz funcional
puede contener uno o más métodos predeterminados o métodos estáticos .) Debido a que una interfaz funcional
contiene solo un método abstracto, puede omitir el nombre de ese método cuando lo implemente.
Para hacer esto, en lugar de utilizar una expresión de clase anónima, utiliza una expresión lambda
```
printPersons(
roster,
(Person p) -> p.getGender() == Person.Sex.MALE
&& p.getAge() >= 18
&& p.getAge() <= 25
);
```
r medio de expresiones lambda podemos referenciar métodos anónimos o métodos sin nombre, lo que nos permite escribir código más claro y conciso que cuando usamos clases anónimas. Una expresión lambda se compone de:
Listado de parámetros separados por comas y encerrados en paréntesis, por ejemplo: (a,b).
El símbolo de flecha hacia la derecha: ->
Un cuerpo que puede ser un bloque de código encerrado entre llaves o una sola expresión.
```
(int a, int b) > a + b
(int a) > a + 1
(int a, int b) > { System.out.println(a + b); return a + b; } () > new ArrayList()
```