DEV Community

Referências de método

  • Conceito: Uma referência de método permite referenciar um método sem executá-lo.

  • Relação com expressões lambda: Ambas requerem um contexto de tipo de destino composto por uma interface funcional compatível.

  • Instância funcional: Uma referência de método cria uma instância de uma interface funcional quando avaliada.

Referências a Métodos Estáticos

  • O nome da classe e o método são separados por dois pontos duplos (::), introduzidos no JDK 8.

  • Pode ser usada onde for compatível com o tipo de destino.

Exemplo de Referência a Métodos Estáticos

  • Interface funcional:
    Nome: IntPredicate
    Método: test(int value)
    Parâmetros: um inteiro.
    Retorno: um booleano (testa condições sobre valores inteiros).

  • Classe auxiliar:
    Nome: MyIntPredicates
    Métodos estáticos implementados:
    isPrime(): verifica se o número é primo.
    isEven(): verifica se o número é par.
    isPositive(): verifica se o número é positivo.

  • Método principal:
    Nome: numTest()
    Parâmetros:
    Uma referência à interface IntPredicate.
    Um número inteiro a ser testado.

  • Execução:
    No método main(), três testes são realizados com numTest().
    Para cada teste, uma referência de método específica (isPrime, isEven, isPositive) é passada como argumento para a execução.

// Demonstra uma referência a um método estático.
// Interface funcional para predicados numéricos que opera com
// valores inteiros.
interface IntPredicate {
boolean test(int n);
}
// Esta classe define três métodos estáticos que verificam um inteiro
// em relação a alguma condição.
class MyIntPredicates {
// Um método estático que retorna true quando um número é primo.
static boolean isPrime(int n) {
if(n < 2) return false;
for(int i=2; i <= n/i; i++) {
if((n % i) == 0)
return false;
}
return true;
}
// Um método estático que retorna true quando um número é par.
static boolean isEven(int n) {
return (n % 2) == 0;
}
// Um método estático que retorna true quando um número é positivo.
static boolean isPositive(int n) {
return n > 0;
}
}
class MethodRefDemo {
// Este método tem uma interface funcional como tipo de seu
// primeiro parâmetro. Logo, pode receber uma referência a
// qualquer instância dessa interface, inclusive uma criada
// por uma referência de método.
static boolean numTest(IntPredicate p, int v) {
return p.test(v);
}
public static void main(String args[])
{
boolean result;
// Aqui, uma referência ao método isPrime é passada para numTest().
result = numTest(MyIntPredicates::isPrime, 17);
if(result) System.out.println("17 is prime.");
// Em seguida, uma referência ao método isEven é usada.
result = numTest(MyIntPredicates::isEven, 12);
if(result) System.out.println("12 is even.");
// Agora, uma referência ao método isPositive é passada.
result = numTest(MyIntPredicates::isPositive, 11);
if(result) System.out.println("11 is positive.");
}
}

  • A referência ao método estático isPrime() é passada como argumento para o método numTest().

  • O método isPrime() é compatível com a interface funcional IntPredicate.

  • A expressão MyIntPredicates::isPrime cria uma referência onde isPrime() implementa o método test() de IntPredicate.

  • As outras chamadas a numTest() seguem o mesmo princípio de compatibilidade e funcionamento.

  • Qualquer método que tenha a assinatura boolean test(int n) pode ser usado como referência para a interface IntPredicate.

Top comments (0)