📌 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
| Interface | Assinatura do método | Exemplo 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
*comString.
🧠 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
- B –
BiConsumerexecuta algo com dois argumentos, mas não retorna nada - C –
ToIntBiFunctionretornainta partir de dois argumentos - A – Concatena a string
"Soma: "com o resultado de2 + 3 - B –
BiPredicatecompara dois objetos e retornaboolean - C –
BinaryOperator<T>é uma especialização deBiFunction<T, T, T>
🧠 Resumo visual
| Interface | Entrada | Saída | Exemplo |
|---|---|---|---|
BiPredicate | T, U | boolean | (a, b) -> a.equals(b) |
BiFunction | T, U | R | (x, y) -> x + y |
BiConsumer | T, U | void | (nome, idade) -> println() |
BinaryOperator | T, T | T | (a, b) -> a * b |
ToIntBiFunction | T, U | int | (a, b) -> a.length() + b |