🔗 Use Method References with Streams

(Usar referências a métodos com Streams)

📌 O que é uma Method Reference?

É uma forma mais concisa de escrever uma lambda que apenas chama um método existente.

Em vez de escrever:

list.forEach(s -> System.out.println(s));

Podemos escrever:

list.forEach(System.out::println);

🧠 Tipos de Method Reference

TipoExemploEquivalente Lambda
Método estáticoClassName::staticMethodx -> ClassName.staticMethod(x)
Instância de objeto específicoobject::instanceMethodx -> object.instanceMethod(x)
Instância de objeto arbitrário (tipo)ClassName::instanceMethod(obj, args) -> obj.instanceMethod(args)
ConstrutorClassName::new() -> new ClassName()

Exemplos Práticos

1. Referência a método estático

List<Integer> numeros = Arrays.asList(1, 2, 3);

numeros.forEach(System.out::println);

Comentário (linha 3):
Aqui usamos System.out::println como referência direta ao método de impressão, substituindo a lambda n -> System.out.println(n).


2. Referência a método de instância de um objeto

List<String> nomes = Arrays.asList("ana", "bruno");

Consumer<String> impressor = System.out::println;
nomes.forEach(impressor);

Comentário (linha 3):
System.out é um objeto. System.out::println se refere ao método de instância dele.


3. Método de instância de um objeto arbitrário

List<String> nomes = Arrays.asList("ana", "bruno");

nomes.sort(String::compareToIgnoreCase);

Comentário (linha 3):
String::compareToIgnoreCase compara dois elementos do tipo String.


4. Construtor com referência

List<String> lista = Arrays.asList("1", "2", "3");

List<Integer> convertidos = lista.stream()
  .map(Integer::new)
  .collect(Collectors.toList());

System.out.println(convertidos);

Comentário (linha 4):
Integer::new chama o construtor de Integer para cada elemento da String.


❌ Exemplos incorretos

// ❌ ERRO: falta de ::
numeros.stream().map(System.out.println); 

// ❌ ERRO: parênteses não usados com ::
Stream.of("a", "b").forEach(String::toUpperCase()); 

List<String> lista = null;
// ❌ NullPointerException
lista.forEach(System.out::println); 

🧪 Quiz com 5 questões

1) Qual é a forma correta de usar referência a método de instância arbitrária?
A) object::method
B) Class::method
C) method::object
D) method::Class


2) O que faz map(String::toUpperCase)?
A) Transforma em uppercase
B) Compara strings
C) Imprime os valores
D) Concatena strings


3) Qual expressão é equivalente a list.forEach(System.out::println)?
A) list.forEach(x -> println(x))
B) list.forEach(x -> System.out.println(x))
C) list.forEach(() -> System.out.println())
D) list.forEach(System::println)


4) Qual é o retorno de:

Stream.of("a", "b", "c")
.map(String::toUpperCase)
.collect(Collectors.joining());

A) abc
B) ABC
C) [A, B, C]
D) null


5) Quando usar Class::new em uma map()?
A) Para chamar métodos estáticos
B) Para imprimir objetos
C) Para criar novas instâncias
D) Para ordenar uma lista


✅ Gabarito comentado

  1. BClass::method é a forma de acessar métodos de instâncias arbitrárias
  2. AString::toUpperCase aplica toUpperCase() em cada elemento
  3. Bx -> System.out.println(x) é igual a System.out::println
  4. B – Resultado será “ABC”
  5. CClass::new cria novos objetos no map

📌 Resumo final

  • Method References deixam o código mais limpo e legível
  • Atuam como atalhos para lambdas simples
  • Funcionam em conjunto com Stream API: map, filter, forEach, etc
  • Usar corretamente ajuda na clareza do código e é cobrado na certificação

Deixe um comentário