✅ Develop code that uses primitive versions of functional interfaces
🔍 Por que versões primitivas?
Interfaces como Function<T, R>, Predicate<T>, Consumer<T>, etc., funcionam com tipos genéricos — o que significa autoboxing e unboxing ao usar tipos primitivos como int, double ou long. Isso pode causar perda de performance.
Solução: O pacote java.util.function oferece versões especializadas para tipos primitivos: IntConsumer, DoublePredicate, LongFunction, etc.
🧩 Principais versões primitivas
| Interface Genérica | Tipo Primitivo | Interface Especializada | Método |
|---|---|---|---|
Predicate<T> | int | IntPredicate | test(int) |
Consumer<T> | double | DoubleConsumer | accept(double) |
Supplier<T> | long | LongSupplier | getAsLong() |
Function<T,R> | int -> String | IntFunction<String> | apply(int) |
ToIntFunction<T> | T -> int | ToIntFunction<T> | applyAsInt(T) |
✅ Exemplos práticos
IntPredicate par = x -> x % 2 == 0;
System.out.println(par.test(4)); // true
Comentário (linha 1): IntPredicate recebe um int e retorna boolean. Aqui testamos se é par.
DoubleConsumer consumidor = d -> System.out.println("Valor: " + d);
consumidor.accept(10.5);
Comentário (linha 1): DoubleConsumer consome um double, sem retorno (void).
LongSupplier id = () -> System.currentTimeMillis();
System.out.println(id.getAsLong());// imprime timestamp atual
Comentário (linha 1): LongSupplier gera um valor long sem entrada.
IntFunction<String> paraTexto = i -> "Número: " + i;
System.out.println(paraTexto.apply(7));// Número: 7
Comentário (linha 1): IntFunction<R> recebe um int e retorna R (aqui, String).
ToIntFunction<String> tamanho = s -> s.length();
System.out.println(tamanho.applyAsInt("Java"));// 4
Comentário (linha 1): ToIntFunction<T> recebe um T (aqui, String) e retorna int.
❌ Erros comuns
IntConsumer consumidor = (Integer x) -> System.out.println(x);// ❌ erro de compilação
Comentário: Interfaces primitivas não usam autoboxing, então o parâmetro deve ser int, não Integer.
LongFunction<Integer> f = x -> x.length();// ❌ long não tem .length()
Comentário: Aqui tentamos usar método de String em long. Erro lógico.
🧠 Quiz com 5 questões
1) O que faz a interface IntPredicate?
A) Recebe int, retorna String
B) Recebe int, retorna boolean
C) Recebe int, retorna void
D) Recebe T, retorna boolean
2) Qual método implementamos ao usar DoubleConsumer?
A) apply(double)
B) test(double)
C) accept(double)
D) consume(double)
3) O que imprime o código abaixo?
ToIntFunction<String> f = s -> s.length();
System.out.println(f.applyAsInt("abc"));
A) 3
B) abc
C) f
D) Erro de compilação
4) Qual interface representa uma função int -> String?
A) Function<int, String>
B) IntFunction<String>
C) ToIntFunction<String>
D) IntToStringFunction
5) O que está errado com este código?
IntConsumer c = (Integer i) -> System.out.println(i);
A) Nada, está correto
B) System.out.println não aceita Integer
C) A lambda não pode usar Integer com IntConsumer
D) accept não existe
✅ Gabarito com comentários
- B –
IntPredicatetestainte retornaboolean - C –
DoubleConsumer.accept(double) - A – O tamanho de
"abc"é 3 - B –
IntFunction<R>recebeint, retornaR - C – Parâmetro precisa ser
int, nãoInteger
🧠 Resumo
| Interface | Descrição |
|---|---|
IntPredicate | int -> boolean |
DoubleConsumer | Consome double, sem retorno |
LongSupplier | Fornece long, sem entrada |
IntFunction<String> | int -> String |
ToIntFunction<T> | T -> int |