Não retorna um mapa ordenado

Bom dia. Tenho o seguinte código que cria uma lista de alunos e depois cria uma nova lista usando o método stream, fazendo um ordenação com uma classe que implementa Comparator, filtrando os alunos com nota acima de 7 e por fim convertendo para lista e atribuindo a novaLista.

List<Aluno> novaLista = null;
		
novaLista.add(new Aluno(1, "Matheus", 7.9));
novaLista.add(new Aluno(2, "Ana", 7.2));

novaLista = lista.stream()
				.sorted(new OrdenaPorNota())
				.filter(al -> al.getNota() > 7)
				.collect(
					Collectors.toList()
				);

Até aqui beleza, quando eu percorro, retorna como esperado:

novaLista.forEach(System.out::println);

Matrícula: 2
Nome: ana
Nota: 7,2

Matrícula: 1
Nome: matheus
Nota: 7,9

Mas quando eu uso quero converter para mapa, não retorna ordenado:

Map<Integer, Double> mapa = new HashMap<>();

mapa = lista.stream()
				.sorted(ordenaPorNota)
				.filter(al -> al.getNota() > 7)
				.collect(
					Collectors.toMap(al -> al.getMatricula(), al -> al.getNota())
				);

mapa.values().forEach(nota -> System.out.println(nota));

Retorno:

7.9
7.2

Alguém pode me esclarecer se estou errando alguma coisa ? Obrigado.

Tente assim (não testei):

Map<String, Long> sortedMap = lista.stream()
	.sorted(ordenaPorNota)
	.filter(al -> al.getNota() > 7)
	.collect(
		Collectors.groupingBy(al -> al.getMatricula(), TreeMap::new, al -> al.getNota())
	);

O segredo está em usar a implementação TreeMap que resulta num SortedMap.

Não deu certo aqui, ele apenas aceita como um conjunto (set) no último parâmetro.

Uma resposta do próprio Brian Goetz como fazer isso: https://stackoverflow.com/a/23846961

Acho que a idéia do @Lucas_Camara funcionaria se você quisesse ordernar por nomes (que é a chave no mapa).

2 curtidas