Java 8 – Method References

Method References surgiu na versão 8 do Java junto a outras features como: lambdas, streams, functional interfaces, etc. Sua utilização permite fazer referência para um método de determinada classe de forma que o código fique simples e facilite a interpretação.
Para utilizá-lo basta usar uma classe ou referência seguida do símbolo “::” sem aspas e em seguida o nome do método sem a utilização de parênteses no final. Por exemplo: Person::getName
Os Method References podem ser definidos em 4 tipos, são eles:

  • Method References para métodos estáticos. Exemplo: ClassName::staticMethod
  • Method References para métodos de instância de um objeto particular. Exemplo: myReference::method
  • Method References para métodos de instância de um objeto arbitrário de um tipo específico. Exemplo: ClassName::method
  • Method References para construtores. Exemplo: ClassName::new

Vejamos um exemplo, dado a classe Person:

public class Person {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Veja abaixo a classe Java8Test utilizando todos os tipos de method references, em seguida explicaremos cada utilização.

import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Supplier;

public class Java8Test {

    static void foo(Supplier<Person> value) {}

    static void bar(Consumer<String>  value) {
        value.accept("John");
    }

    static void printPersonName(Person person) {
        System.out.println(person.getName());
    }

    public static void main(String[] args) {

        // 1º Method References para métodos de instância de um objeto particular
        Person p = new Person();
        bar(p::setName);

        List persons = Arrays.asList(p);
        // 2º Method References para métodos de instância de um objeto arbitrário de um tipo específico
        persons.stream().map(Person::getName);

        // 3º Method References para métodos estáticos
        persons.forEach(Java8Test::printPersonName);

        // 4º Method References para construtores
        foo(Person::new);
    }
}

1º Method References para métodos de instância de um objeto particular

       static void bar(Consumer<String> value) {
        value.accept("Jhon");
       }

       // more code

       // 1º Method References para métodos de instância de um objeto particular
       Person p = new Person();
       bar(p::setName);

Nesse primeiro exemplo, criamos uma instância da classe Person e chamamos o método bar que define um Consumer de String. Em seguida, chamamos o método accept para executar a operação do nosso Consumer passando como parâmetro o nome que será definido a instância de Person. (Este não é um cenário muito comum de utilização, mas é uma forma simples para entender o conceito).

2º Method References para métodos de instância de um objeto arbitrário de um tipo específico

        List persons = Arrays.asList(p);
        // 2º Method References para métodos de instância de um objeto arbitrário de um tipo específico
        persons.stream().map(Person::getName);

Nesse segundo exemplo, criamos uma lista de Person contento o objeto que geramos no exemplo anterior e a partir da lista foi criado um Stream. Em seguida, criamos outro Stream mapeando os nomes de cada objeto Person(Nesse caso um único nome). Note que o método map espera uma Function de Person, nesse caso podemos passar Person::getName como parâmetro.

3º Method References para métodos estáticos

        // 3º Method References para métodos estáticos
        persons.forEach(Java8Test::printPersonName);

A partir da lista de Person criada anteriormente, fizemos um forEach chamando o método estático printPersonName da classe Java8Test.

4º Method References para construtores

        static void foo(Supplier<Person> value) {}

        // more code

        // 4º Method References para construtores
        foo(Person::new);

Nesse exemplo, chamamos o método foo que espera como parâmetro um Supplier de Person, então passamos um novo objeto Person utilizando Method References.

Referências

https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html

 

Por THIAGO TEIXEIRA

Postado em: 10 de junho de 2015

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário