Stream.sorted în Java

Sortează elementele stream-ului, în ordinea naturală sau după un Comparator.

Sintaxă
Stream<T> sorted()
Stream<T> sorted(Comparator<? super T> comparator)

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 Comparable cu sorted() fără argumente. Primești ClassCastException; dă un Comparator.
  • Pui sorted() pe un stream infinit. Sortarea are nevoie de toate elementele, deci nu se termină niciodată; pune limit î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.