Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Porque mapToInt e não mapToDouble

Eu entendo que como se trata de um calculo de média, o valor pode vir a ser um Double na maior parte dos casos. Mas no exercício foi escolhido usar o mapToInt e não o mapToDouble, e o código funciona do mesmo jeito. Então eu gostaria de saber o porque foi escolhido o mapToInt no lugar do mapToDouble, de que forma ele ainda funciona do mesmo se jeito se o resultado for um Double, e quando eu usaria o mapToDouble, obrigado.

2 respostas
solução!

Olá Rodrigo,

Pra entender essa questão, é preciso pensar parte por parte. Considerando o código:

cursos.stream()
    .mapToInt(c -> c.getAlunos())
    .average();

Quando olhamos pra primeira linha, temos um stream de cursos, ok?

cursos.stream() // Stream de cursos

Na segunda linha, pegamos esse stream de cursos e mapeamos pra um IntStream, que é um stream de números inteiros.

cursos.stream()
    .mapToInt(c -> c.getAlunos())  // gera um stream de inteiros com a quantidade de alunos de cada curso

Por que isso?

Porque no momento do mapToInt, estamos olhado pra quantidade de alunos de cada curso, que é um número inteiro. Pode ser 1 aluno, 50 alunos, 1000 alunos, mas sempre será um valor inteiro.

Uma vez que temos na mão o stream de inteiros, aí sim chamamos o average(), que vai calcular a média.

cursos.stream()
    .mapToInt(c -> c.getAlunos())
    .average();  // pega todos os valores inteiros do IntStream, calcula a média e devolve um double

O resultado da média deve ser um double, pois a divisão pode devolver um número quebrado. Apesar disso, a origem pode ser um punhado de números inteiros, sem problema algum.

Se consideramos os números de exemplo que usei ali em cima, teríamos a seguinte média: (1+50+1000)/3 = 350.333...

Abs

Obrigado por esclarecer!