Develop code that uses binary versions of functional interfaces


📌 O que são “binary functional interfaces”?

As binary functional interfaces são aquelas que aceitam dois argumentos. Elas fazem parte do pacote java.util.function e são bastante úteis para comparações, operações matemáticas ou manipulação de dois valores ao mesmo tempo.


🔧 Principais interfaces binárias

InterfaceAssinatura do métodoExemplo comum
BiPredicate<T,U>boolean test(T t, U u)Teste lógico entre dois objetos
BiFunction<T,U,R>R apply(T t, U u)Função com dois inputs e um output
BiConsumer<T,U>void accept(T t, U u)Executa algo com dois argumentos
BinaryOperator<T>T apply(T t1, T t2)Especialização de BiFunction
ToIntBiFunction<T,U>int applyAsInt(T t, U u)Retorna int baseado em dois args

📘 Exemplos práticos


BiPredicate – Verifica condição com dois parâmetros

BiPredicate<String, Integer> maiorQue = (str, num) -> str.length() > num;
System.out.println(maiorQue.test("Java", 3)); // true

Comentário: Compara se o tamanho da string é maior que o número.


BiFunction – Combina dois valores e retorna um

BiFunction<String, String, String> juntar = (a, b) -> a + " " + b;
System.out.println(juntar.apply("Olá", "Mundo"));

// Olá Mundo

Comentário: Concatena duas strings.


BiConsumer – Executa uma ação com dois parâmetros

BiConsumer<String, Integer> imprimir = (nome, idade) ->
System.out.println(nome + " tem " + idade + " anos");
imprimir.accept("João", 30);

Comentário: Aceita dois valores e imprime uma mensagem.


BinaryOperator – Operações com dois valores do mesmo tipo

BinaryOperator<Integer> soma = (a, b) -> a + b;
System.out.println(soma.apply(5, 3));

// 8

Comentário: Soma dois inteiros e retorna o resultado.


ToIntBiFunction – Dois inputs e resultado int

ToIntBiFunction<String, String> tamanhoTotal = (a, b) -> a.length() + b.length();
System.out.println(tamanhoTotal.applyAsInt("Oi", "Java"));

// 6

Comentário: Retorna a soma dos tamanhos das duas strings.


Pegadinhas comuns

BiFunction<Integer, String, String> f = (a, b) -> a + b.length(); 
// ⚠️ tipo de retorno

Aqui o tipo de retorno seria Integer + int = int, mas como o tipo de retorno é String, isso gera erro a menos que se faça cast ou concatenação correta.


BinaryOperator<String> b = (a, b) -> a * b; 
// ❌ erro de compilação

Não é possível usar * com String.


🧠 Quiz com 5 questões

1) Qual a principal característica de BiConsumer?
A) Retorna um valor após processar dois argumentos
B) Executa lógica com dois argumentos sem retorno
C) Aceita apenas um argumento
D) Recebe dois valores e retorna boolean


2) Qual dessas interfaces retorna um valor int com dois argumentos?
A) BinaryOperator<T>
B) BiConsumer<T, U>
C) ToIntBiFunction<T, U>
D) BiPredicate<T, U>


3) O que imprime o código abaixo?

BiFunction<Integer, Integer, String> f = (x, y) -> "Soma: " + (x + y);
System.out.println(f.apply(2, 3));

A) Soma: 5
B) 5
C) Erro de compilação
D) Soma: 2 + 3


4) Qual é a interface mais indicada para verificar se dois valores são iguais?
A) BiConsumer<T, T>
B) BiPredicate<T, T>
C) BiFunction<T, T, Boolean>
D) ToIntFunction<T>


5) O que faz a interface BinaryOperator<T>?
A) Aplica lógica entre dois elementos diferentes
B) Recebe dois tipos diferentes e retorna outro
C) É um tipo de BiFunction onde os tipos de entrada e saída são iguais
D) Sempre retorna um valor booleano


Gabarito com comentários

  1. BBiConsumer executa algo com dois argumentos, mas não retorna nada
  2. CToIntBiFunction retorna int a partir de dois argumentos
  3. A – Concatena a string "Soma: " com o resultado de 2 + 3
  4. BBiPredicate compara dois objetos e retorna boolean
  5. CBinaryOperator<T> é uma especialização de BiFunction<T, T, T>

🧠 Resumo visual

InterfaceEntradaSaídaExemplo
BiPredicateT, Uboolean(a, b) -> a.equals(b)
BiFunctionT, UR(x, y) -> x + y
BiConsumerT, Uvoid(nome, idade) -> println()
BinaryOperatorT, TT(a, b) -> a * b
ToIntBiFunctionT, Uint(a, b) -> a.length() + b