Function

Use a built-in Function<T, R> da java.util.function

🔍 O que é a interface Function<T, R>?

@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
  • Recebe um argumento do tipo T
  • Retorna um resultado do tipo R
  • Muito utilizada em transformações de dados e em operações de mapeamento (map() em Streams)

Exemplo básico de Function

Function<String, Integer> tamanho = s -> s.length();

System.out.println(tamanho.apply("Java")); // 4

Comentário (linha 1):
Cria uma função que recebe uma String e retorna seu tamanho (Integer)


Function com Streams (mapeamento)

List<String> nomes = Arrays.asList("Ana", "Bruno", "Carlos");

List<Integer> tamanhos = nomes.stream()
  .map(s -> s.length())
  .collect(Collectors.toList());

System.out.println(tamanhos); // [3, 5, 6]

Comentário (linha 4):
O map() usa uma Function<String, Integer> para transformar os elementos da Stream.


🔁 Encadeando Functions com andThen() e compose()

Function<String, String> toUpper = s -> s.toUpperCase();
Function<String, String> adicionarExclamacao = s -> s + "!";

Function<String, String> finalFunction = toUpper.andThen(adicionarExclamacao);

System.out.println(finalFunction.apply("java")); // JAVA!

Comentário (linha 4):
andThen() aplica toUpper primeiro, depois adicionarExclamacao.

Function<String, String> finalFunction2 = toUpper.compose(adicionarExclamacao);

System.out.println(finalFunction2.apply("java")); // JAVA!

Comentário (linha 1):
compose() aplica adicionarExclamacao antes, depois toUpper.


Erros comuns com Function

Function<String, String> f = s -> System.out.println(s); 
// ❌ Não compila (não retorna String)

Comentário:
O println retorna void, mas Function precisa retornar R.

Function<String, Integer> f = s -> s; 
// ❌ Erro: retorna String, não Integer

Comentário:
O tipo de retorno declarado não bate com o retorno real da lambda.


📌 Dicas para a prova

  • Function<T, R> é usada quando você transforma um valor
  • andThen() executa uma Function após a atual
  • compose() executa uma Function antes da atual
  • Tipos genéricos precisam coincidir entre os encadeamentos (andThen e compose)

🧠 Quiz com 5 questões

1) O que faz a interface Function<T, R>?
A) Recebe T, retorna R
B) Recebe R, retorna T
C) Retorna boolean
D) Recebe dois argumentos


2) Qual método é obrigatório em uma Function?
A) run()
B) apply()
C) accept()
D) get()


3) O que faz o método andThen() de uma Function?
A) Aplica outra Function antes da atual
B) Aplica outra Function após a atual
C) Executa em paralelo
D) Nada


4) Dado Function<String, Integer> f = s -> s.length();, qual é o valor de f.apply("abcde")?
A) “abcde”
B) 4
C) 5
D) null


5) O que ocorre se uma Function não retornar valor?
A) Compila
B) Lança exceção
C) Erro de compilação
D) Funciona normalmente


Gabarito comentado

  1. A – Function sempre recebe um T e retorna um R
  2. Bapply() é o método abstrato da interface
  3. BandThen aplica a Function adicional depois
  4. C – A String "abcde" tem tamanho 5
  5. C – Function precisa retornar algo. Se não retornar, erro de compilação

🎯 Resumo

InterfaceEntradaSaídaMétodo principal
Consumer<T>Tvoidaccept(T t)
Function<T,R>TRapply(T t)
Predicate<T>Tbooleantest(T t)

Deixe um comentário