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

Dúvida .flatMap e .map

Olá!

Poderiam me explicar detalhadamente novamente o funcionamento dessa conversão de DadosTemporada para Episodio?

List<Episodio> episodios = temporadas.stream()
                    .flatMap(d -> d.episodios().stream()
                            .map(e -> new Episodio(d.numero(), e)))
                    .collect(Collectors.toList());

Busquei na aula anterior, mas ainda está difícil entender. Na 3a. linha, porque o segundo parâmetro é o 'e', visto que ele representa dadosEpisodio?

3 respostas

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

Mateus, obrigado mais uma vez pelas boas explicações!

Dessa forma ficou bem mais claro.

Até sugiro que as aulas futuras pudessem ser sempre bem comentadas, sempre bem detalhadas, como você fez, pois há rotinas dentro dos programas, como essa, que são bem complicadas de entender.

Acho que entendi, então o 'e' se refere ao próprio d.episodios() ?

solução!

Bom dia Sergio,

É isso mesmo, o "e" se refere ao próprio d.episódios

Fico feliz que tenha te ajudado, bons estudo! Marca aqui como solução o/