Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Transformando Stream em Listas

Pessoal, tudo certo?

Eu tava fazendo uns testes com as streams e percebi que utilizando o mapToInt eu não conseguia transformar a stream em uma List de Integer

cursos.stream().mapToInt(Curso::getAlunos).collect(Collectors.toList());

Esse código acima não compilou.

Entretanto, apenas com o map essa operação funciona e consegui atribuir o resultado a uma referência do tipo List

 cursos.stream().map(Curso::getAlunos).collect(Collectors.toList());

Alguém saberia dizer o porquê desse comportamento?

1 resposta
solução!

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!!