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