Oi, Izabela. Tudo bem?
A dúvida sobre a falta de uma atribuição direta (como lista = Collections.sort(lista)) ocorre porque o método Collections.sort() altera a lista diretamente na memória.
Em Java, os objetos são passados por referência. Quando uma lista é enviada como argumento para o método Collections.sort(), o método acessa o endereço de memória original daquela lista e reorganiza os seus elementos internamente. Esse tipo de operação é conhecido como ordenação in-place (no próprio local).
Como o método modifica a própria estrutura que foi passada, o seu tipo de retorno é void. Tentar atribuir o resultado a uma variável geraria um erro de compilação.
Caso o objetivo seja manter a ordem inicial dos elementos para uso posterior, existem duas estratégias principais para realizar a ordenação em uma nova estrutura.
1. Criando uma cópia da lista (Abordagem tradicional)
Antes de aplicar a ordenação, cria-se uma nova instância de lista copiando os dados da primeira. Dessa forma, as alterações acontecem apenas na cópia.
// Lista original intacta
List<Integer> listaOriginal = new ArrayList<>(List.of(1, 3, 2));
// Criando uma cópia para ordenar
List<Integer> listaOrdenada = new ArrayList<>(listaOriginal);
Collections.sort(listaOrdenada);
System.out.println("Original: " + listaOriginal); // Saída: [1, 3, 2]
System.out.println("Ordenada: " + listaOrdenada); // Saída: [1, 2, 3]
2. Utilizando a Stream API (Abordagem Funcional)
A partir do Java 8, a Stream API oferece uma maneira mais direta de gerar uma nova lista ordenada sem mexer na estrutura de origem, utilizando o método sorted().
List<Integer> listaOriginal = List.of(1, 3, 2);
// o método sorted() gera uma nova sequência ordenada
List<Integer> listaOrdenada = listaOriginal.stream()
.sorted()
.toList();
System.out.println("Original: " + listaOriginal); // Saída: [1, 3, 2]
System.out.println("Ordenada: " + listaOrdenada); // Saída: [1, 2, 3]
Nota importante: O uso de List.of() cria listas imutáveis. Tentar usar Collections.sort() diretamente em uma lista criada por List.of() resultará em uma exceção UnsupportedOperationException. Nesses cenários, a abordagem com Streams ou a criação de um new ArrayList<>() é obrigatória.
Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!