apuntes:lambdas
Differences
This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| apuntes:lambdas [2023/05/28 11:47] – created Santiago Faci | apuntes:lambdas [2023/05/28 12:04] (current) – [Referencias a métodos] Santiago Faci | ||
|---|---|---|---|
| Line 2: | Line 2: | ||
| ==== Interfaces funcionales ==== | ==== Interfaces funcionales ==== | ||
| + | |||
| + | * Las interfaces funcionales son interfaces que poseen un único método abstracto (sin implementar) | ||
| + | * Aparecen por primera vez en Java 8 | ||
| + | * Están especialmente preparadas para usarse con expresiones lambda | ||
| + | * Pueden tener definidos métodos por defecto (tienen implementación) | ||
| + | |||
| + | En Java existen una serie de interfaces funcionales ya definidas especialmente útiles | ||
| + | |||
| + | |||
| + | * **Predicate**: | ||
| + | * // | ||
| + | * **Consumer**: | ||
| + | * // | ||
| + | * **Function**: | ||
| + | * // | ||
| + | * **Supplier**: | ||
| + | * // | ||
| + | * **BiPredicate**: | ||
| + | * **BiFunction**: | ||
| + | |||
| + | <code java> | ||
| + | Predicate< | ||
| + | System.out.println(checkEmpty.test(" | ||
| + | System.out.println(checkEmpty.test("" | ||
| + | </ | ||
| + | |||
| + | Pero también podemos crear las nuestras propias: | ||
| + | |||
| + | <code java> | ||
| + | @FunctionalInterface | ||
| + | public interface SayMyName { | ||
| + | void say(String name); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | |||
| + | |||
| + | |||
| ==== Expresiones lambda ==== | ==== Expresiones lambda ==== | ||
| + | |||
| + | * Aparecen por primera vez en Java 8 | ||
| + | * Código más compacto y limpio | ||
| + | * Sustituyen al concepto de clase anónima | ||
| + | * Permiten expresar las instancias de interfaces funcionales de una forma compacta | ||
| + | * Su uso está especialmente extendido en el uso de Streams, donde se pueden utilizar de forma que el código queda mucho más compacto y fácil de entender | ||
| + | * Cuando usamos una tenemos que imaginarnos que estamos implementando el código necesario para ejecutar luego el método que tiene por defecto asignada esa interface | ||
| + | |||
| + | La sintaxis es: | ||
| + | <code java> | ||
| + | (parametros) -> (cuerpo-lambda) | ||
| + | </ | ||
| + | |||
| + | Por ejemplo: | ||
| + | |||
| + | <code java> | ||
| + | // Para ordenar una lista | ||
| + | listaAnimales.sort((animal1, | ||
| + | |||
| + | // Para crear un Predicate que permita evaluar una colección sobre un objeto | ||
| + | Animal unAnimal = new Animal(. . . .) | ||
| + | |||
| + | Predicate< | ||
| + | pesoMayorQue10.test(unAnimal); | ||
| + | </ | ||
| ==== Referencias a métodos ==== | ==== Referencias a métodos ==== | ||
| - | (c) 2023 Santiago Faci | + | Suponiendo que tenemos una colección de cadenas, veamos unos ejemplos que nos permitan utilizar una referencia a un método: |
| + | |||
| + | <code java> | ||
| + | List< | ||
| + | </ | ||
| + | |||
| + | === Métodos estáticos === | ||
| + | |||
| + | <code java> | ||
| + | // Utilizando una expresión lambda | ||
| + | cadenas.forEach((cadena) -> System.out.println(cadena)) | ||
| + | // Equivalente utilizando referencia a método | ||
| + | cadenas.forEach(System.out:: | ||
| + | </ | ||
| + | |||
| + | === Métodos de instancia === | ||
| + | |||
| + | <code java> | ||
| + | // Suponemos que existe una clase CadenasComparator que implementa Comparator | ||
| + | // Utilizando una expresión lambda | ||
| + | cadenas.sort((cadena1, | ||
| + | // Equivalente utilizando una referencia a método suponiendo que existe un objeto de la clase que implementa a CadenasComparator | ||
| + | cadenas.sort(cadenasComparator:: | ||
| + | // Equivalente utilizando una referencia a método | ||
| + | cadenas.sort(CadenasComparator:: | ||
| + | </ | ||
| + | |||
| + | === Constructores === | ||
| + | |||
| + | <code java> | ||
| + | CadenasComparator:: | ||
| + | </ | ||
| + | |||
| + | ---- | ||
| + | |||
| + | (c) 2019-{{date> | ||
apuntes/lambdas.1685274420.txt.gz · Last modified: by Santiago Faci
