🎯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!
| Interface | Entrada | Saída | Exemplo |
|---|---|---|---|
| IntFunction<R> | int | R | i -> "Nº: " + i |
| ToIntFunction<T> | T | int | s -> s.length() |
| IntToDoubleFunction | int | double | i -> i * 2.5 |
| DoubleToIntFunction | double | int | d -> (int) d |
| ToDoubleFunction<T> | T | double | s -> Double.parseDouble(s) |
| LongFunction<R> | long | R | l -> "Long: " + l |
| ToLongFunction<T> | T | long | s -> 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);
}
}