Olá Sergio.
Sim,
d == DadosTemporada
e == DadosEpisodio
São nomes simbólicos, você pode dar o nome que quiser.
Talvez você se questione de onde tá saindo essa coleção episodios
... Essa coleção é um atributo do objeto DadosTemporada
:
@JsonIgnoreProperties(ignoreUnknown = true)
public record DadosTemporada(
@JsonAlias("Season")
Integer numero,
// Aqui está a coleção em questão
@JsonAlias("Episodes")
List<DadosEpisodio> episodios
) {
}
Agora voltando pro código original:
List<Episodio> episodios = temporadas.stream() // Transforma a coleção em uma stream, iterando sobre os objetos DadosTemporada
// Para cada DadosTemporada dentro de temporadas, pega a coleção episodios e também transforma numa Stream
.flatMap(d -> d.episodios().stream()
// Itera sobre os elementos DadosEpisodio da Stream de episodios
// Para cada DadosEpisodio dentro de episodios, cria um objeto Episodio, passando o numero da temporada (d) e o próprio objeto DadosEpisodio da atual iteração (e)
.map(e -> new Episodio(d.numero(), e)))
// Quando acabar de iterar sobre os elementos da coleção `episodios`, passar para o próximo objeto `DadosTemporadas` e repetir o ciclo até acabar todos os elementos `DadosTemporadas`
// Quando acabar todos os objetos `DadosTemporadas`, coletar todos os objetos Episodio que foram criados e criar uma `List<Episodio>`
.collect(Collectors.toList());
Até você se acostumar com isso, recomendo usar nomes mais descritivos em vez de só um letra. O "d" é um Objeto DadosTemporada, então o nome da variável poderia ser "dadosTemporada", assim como o "e" poderia ser "dadosEpisodio". Assim fica bem mais claro.
Bons estudos