(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
| Tipo | Exemplo | Equivalente Lambda |
|---|---|---|
| Método estático | ClassName::staticMethod | x -> ClassName.staticMethod(x) |
| Instância de objeto específico | object::instanceMethod | x -> object.instanceMethod(x) |
| Instância de objeto arbitrário (tipo) | ClassName::instanceMethod | (obj, args) -> obj.instanceMethod(args) |
| Construtor | ClassName::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
- B –
Class::methodé a forma de acessar métodos de instâncias arbitrárias - A –
String::toUpperCaseaplicatoUpperCase()em cada elemento - B –
x -> System.out.println(x)é igual aSystem.out::println - B – Resultado será “ABC”
- C –
Class::newcria novos objetos nomap
📌 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