Ce face Stream.sorted
sorted() fără argumente folosește ordinea naturală: numerele crescător, textele alfabetic (după codul caracterelor). Elementele trebuie să fie Comparable, altfel primești ClassCastException la rulare.
sorted(comparator) sortează după regula ta: Comparator.comparing(Student::nota), cu .reversed() pentru descrescător și .thenComparing(...) pentru al doilea criteriu. Sortarea este stabilă: elementele egale își păstrează ordinea.
Pentru ordinea alfabetică românească (cu ă, â, î, ș, ț la locul lor) folosește un Collator pentru limba română ca și comparator.
Parametri
| Parametru | Descriere |
|---|---|
comparator |
Opțional. Regula după care se compară două elemente. |
Ce returnează
Un stream cu aceleași elemente, sortate.
Exemple
Exemplul 1: Ordinea naturală și ordinea inversă
import java.util.Comparator;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<Integer> note = List.of(7, 10, 5, 9, 8);
System.out.println(note.stream().sorted().toList());
System.out.println(note.stream().sorted(Comparator.reverseOrder()).toList());
List<String> nume = List.of("Mihai", "ana", "Bogdan", "Elena");
System.out.println(nume.stream().sorted().toList());
System.out.println(nume.stream().sorted(String.CASE_INSENSITIVE_ORDER).toList());
}
}
Rezultat
[5, 7, 8, 9, 10]
[10, 9, 8, 7, 5]
[Bogdan, Elena, Mihai, ana]
[ana, Bogdan, Elena, Mihai]
Exemplul 2: Sortare după mai multe câmpuri
Întâi după notă, descrescător; la note egale, după nume.
import java.util.Comparator;
import java.util.List;
public class Main {
record Student(String nume, int nota) {}
public static void main(String[] args) {
List<Student> grupa = List.of(
new Student("Radu", 9), new Student("Ana", 10),
new Student("Ioana", 9), new Student("Dan", 7));
grupa.stream()
.sorted(Comparator.comparingInt(Student::nota).reversed()
.thenComparing(Student::nume))
.forEach(s -> System.out.println(s.nota() + " " + s.nume()));
}
}
Rezultat
10 Ana
9 Ioana
9 Radu
7 Dan
Exemplul 3: Alfabetul românesc cu Collator
Sortarea simplă pune literele cu diacritice după „z”. Un Collator pentru română le pune în ordinea din dicționar.
import java.text.Collator;
import java.util.List;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
List<String> cuvinte = List.of("țară", "sat", "școală", "zmeu", "apă", "ăsta");
System.out.println(cuvinte.stream().sorted().toList());
Collator ro = Collator.getInstance(Locale.of("ro", "RO"));
System.out.println(cuvinte.stream().sorted(ro).toList());
}
}
Rezultat
[apă, sat, zmeu, ăsta, școală, țară]
[apă, ăsta, sat, școală, țară, zmeu]
Greșeli frecvente
- Sortezi obiecte care nu sunt
Comparablecusorted()fără argumente. PrimeștiClassCastException; dă unComparator. - Pui
sorted()pe un stream infinit. Sortarea are nevoie de toate elementele, deci nu se termină niciodată; punelimitînainte. - Aștepți ca textele cu majuscule și minuscule să fie amestecate. Ordinea naturală pune toate majusculele înaintea minusculelor.
Comenzi înrudite
Stream.distinct: Elimină duplicatele din stream, păstrând prima apariție a fiecărei valori.Stream.min / Stream.max: Găsesc cel mai mic și cel mai mare element după un Comparator; rezultatul este un Optional.Stream.limit: limit păstrează doar primele n elemente, iar skip sare peste primele n.Stream.toList: Adună elementele stream-ului într-o listă care nu se poate modifica, sau într-un tablou cu toArray.