Resumo das Interfaces

🎯Objetivo do Tópico

  • 👨‍💻 Todas as interfaces funcionais Function, BiFunction, UnaryOperator, IntFunction, etc.
  • 🎯 Explicações curtas de quando usar cada uma
  • 🔁 Exemplos de código prático
  • 💡 Dicas de prova e pegadinhas

✅ RESUMO: Interfaces Funcionais da Família Function (Java 8 – OCP)


🧩 1. Function<T, R>

  • Recebe T, retorna R
Function<String, Integer> f = s -> s.length();

🧩 2. BiFunction<T, U, R>

  • Recebe dois argumentos, retorna um resultado
BiFunction<String, String, Integer> f = 
(s1, s2) -> (s1 + s2).length();

🧩 3. UnaryOperator<T>

  • Recebe e retorna o mesmo tipo
UnaryOperator<String> upper = s -> s.toUpperCase();

🧩 4. BinaryOperator<T>

  • Recebe dois argumentos do mesmo tipo e retorna o mesmo tipo
BinaryOperator<Integer> soma = (a, b) -> a + b;

🔢 Interfaces com primitivas — Mais cobradas na prova!

InterfaceEntradaSaídaExemplo
IntFunction<R>intRi -> "Nº: " + i
ToIntFunction<T>Tints -> s.length()
IntToDoubleFunctionintdoublei -> i * 2.5
DoubleToIntFunctiondoubleintd -> (int) d
ToDoubleFunction<T>Tdoubles -> Double.parseDouble(s)
LongFunction<R>longRl -> "Long: " + l
ToLongFunction<T>Tlongs -> s.length() * 100L

💡 Dicas e Pegadinhas da Prova:

Evite autoboxing desnecessário: IntStream + boxed()Stream<Integer>

Cuidado com métodos como apply() vs applyAsInt()
Ex: ToIntFunction<T> usa applyAsInt()

Não existe IntFunction<int> — não se pode usar tipos primitivos como argumentos genéricos

Fique de olho em inferência de tipo em lambdas, especialmente em BiFunction ou BinaryOperator


📘 Exemplo completo:

public class FuncaoPrimitiva {
  public static void main(String[] args) {
    ToIntFunction<String> f = s -> s.length(); // String → int
    IntFunction<String> g = i -> "Nº: " + i; // int → String

    String str = "Java";
    int tamanho = f.applyAsInt(str); // 4
    String msg = g.apply(tamanho); // "Nº: 4"

    System.out.println(msg);
  }
}