Método de referencia Java 8 é un dos conceptos que veñen coas novas expresións lambda que veñen en JDK 8, explicámolo paso a paso. Ata este momento en Java había dous conceptos, clases e interfaces fundamentais.
con el chega As expresións de Java 8 Lambda aparecen:
Estas expresións permítennos unha maior reutilización do noso código xa que no seu lugar de reutilizar clases podemos simplemente reutilizar funcións. Estes son convertidos para poñelo dalgún xeito na unidade de código mínimo. Para Java integrar estes conceptos, debemos supoñer que as concesións deben ser concesións xa que Java só permite a xestión de clases e interfaces. Deste xeito, as expresións de Lambda chegarán a ser interfaces que só soportan un método abstracto. En Java 8 hai moitas destas interfaces predefinidas. Para abordar o noso exemplo imos apoiar a interface de consumo < que ten un único método que se chama aceptación que recibe un parámetro e non devolve nada. É unha das interfaces funcionais máis sinxelas.
package com.arquitecturajava.lambdareferencias;import java.util.function.Consumer;public class Principal {public static void main(String args) {Consumer<String> consumidor = (x) -> System.out.println(x); consumidor.accept("hola");}}
Neste caso, temos asignado á interface funcional ao consumidor dunha expresión lambda que encaixa con ela. Lembre que a interface recibe un parámetro e non devolve nada, o resultado imprimirá Hola pola consola:
Quizais queiramos ter unha maior flexibilidade no noso código e apoiarnos nun método que nos permita variar a expresión lambda e o texto que imprimimos.
package com.arquitecturajava.lambdareferencias;import java.util.function.Consumer;public class Principal {public static void main(String args) {Consumer<String> consumidor = (x) -> System.out.println(x);consumidor.accept("hola");procesar ((x)->System.out.println(x),"hola2");}public static <T> void procesar(Consumer<T> expresion, T mensaje) {expresion.accept(mensaje);}}
O resultado será similar:
Método de referencia Java 8
Agora as expresións lambda que permiten engadir máis flexibilidade ao código. Por exemplo, podemos ter outro método impreso na mesma clase que cumpre co patrón da expresión lambda (recibe un parámetro e non devolve nada).
Podemos usar a sintaxe de método de referencia de Java 8 para invocar o proceso proceso que nos apoia nesta nova función.
package com.arquitecturajava.lambdareferencias;import java.util.function.Consumer;public class Principal {public static void main(String args) {Consumer<String> consumidor = (x) -> System.out.println(x);consumidor.accept("hola");procesar ((x)->System.out.println(x),"hola2");procesar(Principal::imprimir,"hola3");}public static <T> void procesar(Consumer<T> expresion, T mensaje) {expresion.accept(mensaje);}public static void imprimir(String mensaje) {System.out.println("---------");System.out.println(mensaje);System.out.println("---------");}}
Como podes ver, usamos a sintaxe principal :: Impresión para ir como referencia a unha función que está no noso Programa propio.
A consola mostrará:
Isto traerá unha gran flexibilidade ao método xa que se temos outra clase que ten un método que recibe un parámetro e non devolve tamén pode usalo:
package com.arquitecturajava.lambdareferencias;public class Impresora {public void imprimir (String mensaje) {System.out.println("imprimiendo impresora");System.out.println(mensaje);System.out.println("imprimiendo impresora");}}
e N, neste caso, creamos a clase da impresora, podemos usar o seu método imprimir coma se fose unha referencia a unha expresión lambda.
package com.arquitecturajava.lambdareferencias;import java.util.function.Consumer;public class Principal {public static void main(String args) {Consumer<String> consumidor = (x) -> System.out.println(x);consumidor.accept("hola");procesar ((x)->System.out.println(x),"hola2");procesar(Principal::imprimir,"hola3");Impresora i= new Impresora();procesar(i::imprimir,"hola4");}public static <T> void procesar(Consumer<T> expresion, T mensaje) {expresion.accept(mensaje);}public static void imprimir(String mensaje) {System.out.println("---------");System.out.println(mensaje);System.out.println("---------");}}
O programa principal será Imprimir a funcionalidade da impresora: