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 unrecordca parametru. - Folosești
BiFunction<Integer, Integer, Integer>unde o metodă cereBinaryOperator<Integer>(de exemplureduce). 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.