Java 8 Método de referência é um dos conceitos que vêm com as novas expressões lambda que vêm em JDK 8, explicaremos passo a passo. Até este momento em Java havia dois conceitos, classes e interfaces fundamentais.
com ele chega Java 8 lambda expressões aparecem:
Estas expressões permitem-nos uma reutilização maior do nosso código já que de reutilizar classes, podemos simplesmente reutilizar funções. Estes são convertidos para colocá-lo de alguma forma na unidade de código mínimo. Para o Java para integrar esses conceitos, devemos supor que as concessões devem ser concessionárias, uma vez que o Java permite apenas o gerenciamento de classes e interfaces. Assim, as expressões lambda vêm para serem interfaces que suportam apenas um método abstrato. Em Java 8 existem muitas dessas interfaces predefinidas. Para resolver nosso exemplo, vamos suportar a interface do consumidor < que tem um único método que é chamado de aceitar que recebe um parâmetro e não retorna nada. É uma das interfaces funcionais mais simples.
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, atribuídos ao consumidor de interface funcional uma expressão lambda que se encaixa nela. Lembre-se de que a interface recebe um parâmetro e não retorna nada, o resultado imprimirá olá pelo console:
Podemos querer ter uma maior flexibilidade em nosso código e nos apoiar em um método que nos permite variar a expressão 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á semelhante:
Java 8 Método de referência
Agora as expressões lambda que permitem adicionar mais flexibilidade ao código. Por exemplo, podemos ter outro método imprimir na mesma classe que está em conformidade com o padrão da expressão lambda (recebe um parâmetro e não retorna nada).
Podemos usar a sintaxe do método de referência Java 8 para invocar o processo Processo nos apoiando nesta nova função.
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 você pode ver, usamos a sintaxe principal :: impressão para ir como referência uma função que está em nosso Programa próprio.
O console mostrará:
Isso trará grande flexibilidade para o método, uma vez que, se tivermos outra classe que tenha um método que receba um parâmetro e não retorne, você também pode usá-lo:
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 este caso criamos a classe da impressora, podemos usar o seu método imprimir como se fosse uma referência a uma expressão 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 Imprima a funcionalidade da impressora: