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.