0Pricing
Java Academy · Aula

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); // 2

Referê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)); // 30

Ordenaçã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, Charlie

Quando 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.0

Verificaçã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

  1. Referências a Métodos Estáticos
  2. Referências a Métodos de Instância Específica
  3. Referências a Métodos de Instância Arbitrária
  4. Referências a Construtores
← Voltar para Java Academy