Olá Vinicius, tudo bem com você?
Olhando na documentação dos métodos, o método map()
retorna uma Stream, enquanto o mapToInt()
retorna uma IntStream. Legal, mas qual é a diferença?
Bom, voltando na documentação, dessa vez nas interfaces Stream e IntStream. Vemos que a assinatura dessas interfaces são um pouco diferentes:
Stream
public interface Stream<T>
extends BaseStream<T,Stream<T>>
Recebe valores de um tipo qualquer (T) e retorna uma stream de elementos desse mesmo tipo (Stream<T>
).
IntStream
public interface IntStream
extends BaseStream<Integer,IntStream>
Recebe valores do tipo Integer e retorna uma stream de valores primitivos inteiros int (IntStream
).
Então, podemos concluir que:
para que possamos usar método collect(Collectors.toList())
, precisamos de uma stream que não seja de valores primitivos int, mas sim de objetos Integer;
não conseguimos converter a IntStream
retornada pelo mapToInt()
para uma Stream<Integer>
.
Nesse caso, acredito que a melhor escolha seja manter apenas o map()
já que só estamos extraindo informações dos cursos. Mas caso você precise manipular essas informações e faça sentido gerar uma IntStream
para isso, podemos usar o método boxed() da própria interface IntStream
que irá converter cada valor primitivo int da stream retornada por mapToInt()
para um Integer. Dessa forma, podemos reescrever o seu primeiro código dessa forma:
cursos.stream().mapToInt(Curso::getAlunos).boxed().collect(Collectors.toList());
Espero ter ajudado. Se ficou alguma dúvida é só avisar!
Abraços e bons estudos!!