Olá Maurício, tudo bem?
Você interpretou corretamente o trecho:
temporadas.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));
temporadas
é uma lista de objetos do tipo Temporada.- Para cada temporada (
t
), ele chama t.episodios()
, que aparentemente retorna uma lista de episódios. - Em seguida, faz um
forEach
nessa lista de episódios, e para cada episódio (e
), imprime o título: e.titulo()
.
Mas por que isso funciona se titulo
não está em Temporada
?
Porque titulo()
está no objeto Episodio
, não em Temporada
.
O ponto-chave é que:
- Você não está acessando
titulo()
diretamente de Temporada
, mas sim do retorno de t.episodios()
, ou seja, da lista de Episodio
. - A IDE entende que
t.episodios()
retorna uma coleção de Episodio
, e que Episodio
tem o método titulo()
.
Em resumo:
A IDE (e o compilador) não dá erro porque:
t.episodios()
retorna uma lista de objetos Episodio
.- Cada
Episodio
tem o método titulo()
. - A sintaxe com lambdas está correta.
Se você tentar chamar t.titulo()
diretamente, aí sim daria erro, porque titulo()
não existe em Temporada
.