Referências a Métodos Estáticos
Substitua lambdas que chamam métodos estáticos por referências ClassName::methodName.
Referências a Métodos Estáticos é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
O que são referências de métodos?
Uma referência de método é uma expressão lambda abreviada que delega a um método existente. Quando uma expressão lambda apenas chamaria um único método, a referência de método é mais simples e legível.
import java.util.*;
import java.util.stream.*;
List<String> names = List.of("Alice", "Bob", "Carol");
// Lambda:
names.forEach(s -> System.out.println(s));
// Equivalent method reference:
names.forEach(System.out::println);Sintaxe de referência a método estático
Uma referência a método estático tem o formato ClassName::staticMethodName. Ela pode ser usada sempre que uma interface funcional esperar um método com a mesma assinatura.
import java.util.stream.*;
// Integer.parseInt(String) matches Function<String, Integer>
List<String> strs = List.of("1","2","3","4","5");
List<Integer> nums = strs.stream()
.map(Integer::parseInt) // replaces s -> Integer.parseInt(s)
.collect(Collectors.toList());
System.out.println(nums); // [1, 2, 3, 4, 5]Math.abs como referência de método
Métodos estáticos de classes utilitárias, como Math, podem ser referenciados diretamente:
import java.util.*;
import java.util.stream.*;
List<Integer> values = List.of(-3, 5, -1, 8, -4);
List<Integer> abs = values.stream()
.map(Math::abs) // replaces v -> Math.abs(v)
.collect(Collectors.toList());
System.out.println(abs); // [3, 5, 1, 8, 4]Referência a método estático com predicado
Métodos estáticos com retorno booleano podem atuar como Predicate:
import java.util.stream.*;
// String.isEmpty() is an instance method, but we can use a static helper
// Objects.isNull matches Predicate<Object>
List<String> mixed = Arrays.asList("hello", null, "world", null);
long nullCount = mixed.stream()
.filter(Objects::isNull)
.count();
System.out.println(nullCount); // 2
long nonNull = mixed.stream()
.filter(Objects::nonNull)
.count();
System.out.println(nonNull); // 2Referência estática de Comparator
Métodos estáticos compatíveis com Comparator também podem ser referenciados:
import java.util.*;
import java.util.stream.*;
List<String> words = List.of("banana", "apple", "cherry");
// String.CASE_INSENSITIVE_ORDER is a Comparator
List<String> sorted = words.stream()
.sorted(String::compareToIgnoreCase)
.collect(Collectors.toList());
System.out.println(sorted); // [apple, banana, cherry]Método auxiliar estático personalizado
Defina um método utilitário estático e referencie-o diretamente:
class Validator {
static boolean isPositive(int n) { return n > 0; }
static String toLabel(int n) { return n > 0 ? "POS" : "NEG"; }
}
List<Integer> nums = List.of(-2, 3, -1, 5, 0);
List<Integer> positive = nums.stream()
.filter(Validator::isPositive)
.collect(Collectors.toList());
System.out.println(positive); // [3, 5]
List<String> labels = nums.stream()
.map(Validator::toLabel)
.collect(Collectors.toList());BiFunction com método estático
Métodos estáticos que recebem dois parâmetros podem ser compatíveis com BiFunction<T,U,R>:
import java.util.function.*;
// Math.max(int,int) → BiFunction... but needs IntBinaryOperator
java.util.function.IntBinaryOperator maxOp = Math::max;
System.out.println(maxOp.applyAsInt(7, 3)); // 7
// String.format as BiFunction? Only works if signature matches:
// Integer.sum(int,int) → IntBinaryOperator
java.util.function.IntBinaryOperator sum = Integer::sum;
System.out.println(sum.applyAsInt(10, 20)); // 30Ordenação com Comparator.comparing + referência estática
Combine Comparator.comparing com referências a métodos para obter uma ordenação clara:
record Person(String name, int age) {}
List<Person> people = List.of(
new Person("Charlie",30), new Person("Alice",25), new Person("Bob",35)
);
people.stream()
.sorted(Comparator.comparing(Person::name))
.forEach(p -> System.out.println(p.name()));
// Alice, Bob, CharlieQuando usar referências a métodos estáticos
Use referências a métodos estáticos quando:
- O corpo da expressão lambda for uma única chamada a um método estático
- Não for necessária nenhuma transformação dos argumentos
- A assinatura do método corresponder à interface funcional
Se precisar transformar argumentos ou adicionar lógica, continue usando uma expressão lambda.
Comparação de legibilidade
Comparação lado a lado dos estilos de expressão lambda e referência de método:
// Lambda style
Stream.of("1","2","3").map(s -> Integer.parseInt(s));
Stream.of(1,-2,3).filter(n -> n > 0);
Stream.of(-5,2,-1).map(n -> Math.abs(n));
// Method reference style
Stream.of("1","2","3").map(Integer::parseInt);
Stream.of(1,-2,3).filter(Validator::isPositive);
Stream.of(-5,2,-1).map(Math::abs);Armadilha comum: assinatura incorreta
Uma referência de método só funciona quando sua assinatura corresponde exatamente ao método abstrato da interface funcional. Se os tipos ou a quantidade de argumentos forem diferentes, use um invólucro com expressão lambda.
// Math.pow(double, double) needs two args — can't use as Function<Double, Double>
// This won't compile:
// Function<Double, Double> square = Math::pow; // ERROR
// Fix with lambda:
Function<Double, Double> square = n -> Math.pow(n, 2);
System.out.println(square.apply(5.0)); // 25.0Verificação rápida
Qual das opções a seguir é uma referência válida a método estático que funciona como Predicate<Object>?
Recapitulação: referências a métodos estáticos
Principais pontos:
- Sintaxe: ClassName::staticMethodName
- Substitui expressões lambda que delegam a um único método estático
- A assinatura do método deve corresponder ao método abstrato da interface funcional
- Funciona com predicados, Function, consumidores, comparadores e outros
- Use expressões lambda quando for necessária uma transformação dos argumentos ou lógica adicional
Perguntas Frequentes
A aula “Referências a Métodos Estáticos” é grátis?
Sim — o texto completo de “Referências a Métodos Estáticos” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Referências a Métodos Estáticos”?
Substitua lambdas que chamam métodos estáticos por referências ClassName::methodName. Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Referências a Métodos Estáticos”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Referências a Métodos Estáticos
- Referências a Métodos de Instância Específica
- Referências a Métodos de Instância Arbitrária
- Referências a Construtores