Versões primitivas de Interfaces funcionais

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éricaTipo PrimitivoInterface EspecializadaMétodo
Predicate<T>intIntPredicatetest(int)
Consumer<T>doubleDoubleConsumeraccept(double)
Supplier<T>longLongSuppliergetAsLong()
Function<T,R>int -> StringIntFunction<String>apply(int)
ToIntFunction<T>T -> intToIntFunction<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

  1. BIntPredicate testa int e retorna boolean
  2. CDoubleConsumer.accept(double)
  3. A – O tamanho de "abc" é 3
  4. BIntFunction<R> recebe int, retorna R
  5. C – Parâmetro precisa ser int, não Integer

🧠 Resumo

InterfaceDescrição
IntPredicateint -> boolean
DoubleConsumerConsome double, sem retorno
LongSupplierFornece long, sem entrada
IntFunction<String>int -> String
ToIntFunction<T>T -> int