Sort a collection using Stream API

🧠 Resumo Rápido

Para ordenar coleções com Stream API, usamos o método .sorted().

Existem duas formas principais:

  1. stream.sorted() – usa a ordem natural dos elementos (precisam implementar Comparable)
  2. stream.sorted(Comparator) – permite fornecer um critério de ordenação customizado

🔹 Exemplo 1 – Ordem natural

List<String> nomes = List.of("Carlos", "Ana", "Bruno");

List<String> ordenados = nomes.stream()
.sorted() // Usa compareTo da String
.collect(Collectors.toList());

// Resultado: [Ana, Bruno, Carlos]

🔹 Exemplo 2 – Ordem reversa

List<String> nomes = List.of("Carlos", "Ana", "Bruno");

List<String> ordenados = nomes.stream()
.sorted(Comparator.reverseOrder())
.collect(Collectors.toList());

// Resultado: [Carlos, Bruno, Ana]

🔹 Exemplo 3 – Ordenar por campo (objeto)

class Pessoa {
String nome;
int idade;

Pessoa(String nome, int idade) {
this.nome = nome;
this.idade = idade;
}

public String toString() {
return nome + " - " + idade;
}
}

List<Pessoa> pessoas = List.of(
new Pessoa("Ana", 30),
new Pessoa("Carlos", 25),
new Pessoa("Bruno", 28)
);

// Ordenar por idade
List<Pessoa> ordenadas = pessoas.stream()
.sorted(Comparator.comparingInt(p -> p.idade))
.collect(Collectors.toList());

🧨 Pegadinhas que caem na prova

🔸 Pegadinha 1: .sorted() só funciona se os elementos forem comparáveis (Comparable implementado).

🔸 Pegadinha 2: sorted() não modifica a lista original. O stream é imutável.

🔸 Pegadinha 3: Cuidado com List.of(...), que é imutável – tentar sort() direto nela dá erro.


✅ Métodos úteis com .sorted()

MétodoDescrição
sorted()Ordem natural (Comparable)
sorted(Comparator.reverseOrder())Ordem inversa
sorted(Comparator.comparing(...))Ordenação customizada
comparingInt(), comparingDouble()Para tipos primitivos

💡 Dica de prova

  • Prefira Comparator.comparingInt() para inteiros (evita boxing).
  • Não confunda .sort() da List com .sorted() do Stream.
  • Streams são imutáveis → sempre use .collect() para obter a nova lista.

🔸 1. Qual das alternativas ordena corretamente uma lista de Strings usando Stream API?

A) lista.stream().sort().collect(Collectors.toList());
B) lista.stream().sorted().collect(Collectors.toList());
C) lista.sorted().stream().collect(Collectors.toList());
D) lista.stream().orderBy().collect(Collectors.toList());


🔸 2. O que acontece ao usar sorted() em uma stream de objetos que não implementam Comparable e sem fornecer um Comparator?

A) Lança ClassCastException
B) Lança NullPointerException
C) Ordena aleatoriamente
D) Compila normalmente, mas dá erro de lógica


🔸 3. Qual a principal diferença entre sorted() e List.sort()?

A) Ambos modificam a lista original
B) Apenas List.sort() modifica a lista original
C) sorted() é exclusivo para listas mutáveis
D) List.sort() cria uma nova lista


🔸 4. Considerando a classe abaixo, qual expressão ordena por nome em ordem alfabética?

class Pessoa {
String nome;
int idade;
}

A) stream.sorted((p1, p2) -> p1.nome < p2.nome)
B) stream.sorted(Comparator.comparing(p -> p.nome))
C) stream.sorted(Comparator.comparing(Pessoa::getNome))
D) B e C estão corretas


🔸 5. Dado:

List<Integer> numeros = List.of(5, 2, 8, 1);

Qual expressão ordena do menor para o maior?

A) numeros.stream().sorted().collect(Collectors.toList());
B) numeros.stream().sort().collect(Collectors.toList());
C) numeros.stream().sorted((a,b) -> b - a).collect(Collectors.toList());
D) A e C estão corretas


🔸 6. O que retorna Comparator.reverseOrder()?

A) Um Comparator que inverte a ordem natural
B) Um Comparator que retorna null
C) Um Comparator que compara por hashcode
D) Um método da classe Stream


🔸 7. Qual é mais eficiente para ordenar inteiros com Stream?

A) Comparator.comparing(p -> p.idade)
B) Comparator.comparingInt(p -> p.idade)
C) Comparator.comparing(Integer::valueOf)
D) Ambas são igualmente eficientes


🔸 8. Qual expressão ordena uma stream de doubles na ordem decrescente?

A) sorted(Comparator.comparingDouble(d -> -d))
B) sorted().reversed()
C) sorted(Comparator.reverseOrder())
D) A e C estão corretas


🔸 9. É possível ordenar um Set com Stream API?

A) Sim, convertendo para stream e usando sorted()
B) Não, Set não pode ser ordenado
C) Apenas TreeSet pode ser ordenado
D) Somente com .sort()


🔸 10. O que acontece se null aparecer em uma Stream e for usado sorted()?

A) Ordena normalmente
B) Lança NullPointerException
C) Ignora os null
D) Substitui null por zero


Gabarito Comentado

  1. B.sorted() é o método correto, .sort() não existe em stream.
  2. A – Se o objeto não implementa Comparable, o sorted() sem Comparator lança ClassCastException.
  3. BList.sort() modifica a lista, stream.sorted() não.
  4. D – Ambos comparing(p -> p.nome) e Pessoa::getNome funcionam.
  5. Dsorted() ordena crescente, (b - a) faz decrescente.
  6. AreverseOrder() inverte a ordem natural.
  7. BcomparingInt evita boxing e é mais eficiente para primitivos.
  8. D – Ambas expressões ordenam decrescente com doubles.
  9. A – Qualquer coleção pode ser transformada em Stream e ordenada.
  10. Bsorted() com null geralmente lança NullPointerException se compareTo for chamado.