BiFunction în Java

O funcție cu doi parametri (de tipuri T și U) care returnează un R; o apelezi cu apply(a, b).

Sintaxă
import java.util.function.BiFunction;

@FunctionalInterface
public interface BiFunction<T, U, R> {
    R apply(T t, U u);
}

Ce face BiFunction

BiFunction<T, U, R> este ca Function, dar cu doi parametri. apply(a, b) primește un T și un U și returnează un R. Exemple: „prețul și cantitatea dau totalul”, „numele și orașul dau o etichetă”.

O întâlnești în metodele de map: map.merge(cheie, valoare, BiFunction), map.compute(cheie, BiFunction), map.replaceAll(BiFunction), și la Collectors.teeing. Are și andThen(Function), ca să transformi rezultatul.

Când ambii parametri și rezultatul au același tip, se folosește de obicei BinaryOperator<T>, care este o BiFunction<T, T, T>.

Parametri

Parametru Descriere
t, u Pentru apply: cele două valori de intrare.

Ce returnează

apply returnează rezultatul, de tip R.

Exemple

Exemplul 1: Total de plată din preț și cantitate

import java.util.function.BiFunction;

public class Main {
    public static void main(String[] args) {
        BiFunction<Double, Integer, Double> total = (pret, cantitate) -> pret * cantitate;
        BiFunction<String, String, String> eticheta = (nume, oras) -> nume + " din " + oras;

        System.out.println(total.apply(4.5, 3) + " lei");
        System.out.println(eticheta.apply("Ana", "Iași"));
        System.out.println(total.andThen(t -> t > 10 ? "scump" : "ieftin").apply(4.5, 3));
    }
}

Rezultat

13.5 lei
Ana din Iași
scump

Exemplul 2: BiFunction în metodele de Map

replaceAll primește cheia și valoarea veche și returnează valoarea nouă; compute la fel, pentru o singură cheie.

import java.util.Map;
import java.util.TreeMap;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> stoc = new TreeMap<>(Map.of("mere", 10, "pere", 4, "prune", 0));

        stoc.replaceAll((produs, cantitate) -> cantitate + 5);
        System.out.println(stoc);

        stoc.compute("pere", (produs, cantitate) -> cantitate == null ? 1 : cantitate * 2);
        System.out.println(stoc);
    }
}

Rezultat

{mere=15, pere=9, prune=5}
{mere=15, pere=18, prune=5}

Greșeli frecvente

  • Ai nevoie de trei parametri. Biblioteca standard nu are TriFunction; definește-ți propria interfață funcțională sau folosește un record ca parametru.
  • Folosești BiFunction<Integer, Integer, Integer> unde o metodă cere BinaryOperator<Integer> (de exemplu reduce). Tipurile nu sunt interschimbabile.

Comenzi înrudite

  • Function: O funcție care primește o valoare de tip T și returnează una de tip R; o apelezi cu apply.
  • BinaryOperator: O funcție care combină două valori de același tip într-una (T, T → T); folosită de reduce, toMap și Map.merge.
  • Collectors.teeing: Trimite fiecare element la doi colectori deodată și unește cele două rezultate cu o funcție, într-o singură parcurgere.
  • Consumer: O acțiune care primește o valoare și nu returnează nimic (afișează, salvează, trimite); o rulezi cu accept.