Ce face Integer.compare
Integer.compare(x, y) returnează un număr negativ dacă x < y, 0 dacă sunt egale și un număr pozitiv dacă x > y. Este forma cerută de Comparator și de compareTo. Folosește-o în loc de x - y, care poate da overflow pentru numere mari.
Integer.max, Integer.min și Integer.sum fac exact ce fac Math.max, Math.min și operatorul +. Au fost adăugate în Java 8 ca să poată fi folosite ca referințe la metode: stream.reduce(0, Integer::sum) sau reduce(Integer::max).
Parametri
| Parametru | Descriere |
|---|---|
x, y / a, b |
Cele două numere. |
Ce returnează
compare: negativ, 0 sau pozitiv. max/min: unul dintre numere. sum: suma lor (cu overflow, ca +).
Exemple
Exemplul 1: Rezultatele lui compare
public class Main {
public static void main(String[] args) {
System.out.println(Integer.compare(7, 10));
System.out.println(Integer.compare(10, 10));
System.out.println(Integer.compare(10, 7));
int a = Integer.MIN_VALUE;
int b = 1;
System.out.println("a - b = " + (a - b) + " (greșit: pare că a > b)");
System.out.println("compare = " + Integer.compare(a, b));
}
}
Rezultat
-1
0
1
a - b = 2147483647 (greșit: pare că a > b)
compare = -1
Exemplul 2: Sortarea elevilor după notă
import java.util.ArrayList;
import java.util.List;
public class Main {
record Elev(String nume, int nota) {}
public static void main(String[] args) {
List<Elev> elevi = new ArrayList<>(List.of(new Elev("Ana", 9), new Elev("Ion", 7), new Elev("Maria", 10)));
elevi.sort((x, y) -> Integer.compare(y.nota(), x.nota()));
for (Elev e : elevi) {
System.out.println(e.nume() + " " + e.nota());
}
}
}
Rezultat
Maria 10
Ana 9
Ion 7
Exemplul 3: sum, max și min cu stream-uri
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> vanzari = List.of(120, 340, 95, 410);
int total = vanzari.stream().reduce(0, Integer::sum);
int maxim = vanzari.stream().reduce(Integer.MIN_VALUE, Integer::max);
int minim = vanzari.stream().reduce(Integer.MAX_VALUE, Integer::min);
System.out.println("Total: " + total + " lei, maxim: " + maxim + ", minim: " + minim);
System.out.println(Integer.max(3, 8) + " " + Integer.min(3, 8) + " " + Integer.sum(3, 8));
}
}
Rezultat
Total: 965 lei, maxim: 410, minim: 95
8 3 11
Greșeli frecvente
- Scrii comparatorul ca
(x, y) -> x - y. Pentru numere foarte mari sau foarte mici scăderea dă overflow și ordinea iese greșită. FoloseșteInteger.compare. - Te aștepți ca
comparesă returneze exact -1 sau 1. Contractul spune doar „negativ” sau „pozitiv”: verifică< 0, nu== -1.
Comenzi înrudite
Comparatori (Comparable și Comparator): Comparable dă ordinea naturală a unei clase (compareTo); Comparator descrie orice altă ordine și se combină cu comparing, thenComparing și reversed.Math.max: max() și min() aleg cel mai mare sau cel mai mic dintre două numere; clamp() încadrează o valoare între două limite.Integer: Clasa wrapper pentru int: obiectul care învelește un număr întreg, plus constante și metode de conversie.Double.compare: Compară două valori double și returnează negativ, 0 sau pozitiv, tratând corect NaN și -0.0.String.compareTo: Compară două șiruri în ordine lexicografică: rezultat negativ, zero sau pozitiv; variante fără litere mari/mici.