Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

[Sugerencia] Haga lo que hicimos: aplicando streams y manipulando datos

package com.aluracursos.screenmatch.principal;

import com.aluracursos.screenmatch.model.DatosEpisodio;
import com.aluracursos.screenmatch.model.DatosSerie;
import com.aluracursos.screenmatch.model.DatosTemporadas;
import com.aluracursos.screenmatch.model.Episodio;
import com.aluracursos.screenmatch.service.ConsumoAPI;
import com.aluracursos.screenmatch.service.ConvierteDatos;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Principal {

    private Scanner teclado = new Scanner(System.in);
    private ConsumoAPI consumoApi = new ConsumoAPI();
    private final String URL_BASE = "https://www.omdbapi.com/?t=";
    private final String API_KEY = "&apikey=c236e1a";
    private ConvierteDatos conversor = new ConvierteDatos();

    public void muestraElMenu(){
        System.out.println("Por favor escribe el nombre de la serie que deseas buscar: ");

        // Busca los datos de serie
        var nombreSerie = teclado.nextLine();
        var json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ","+") + API_KEY);
        var datos = conversor.obtenerDatos(json, DatosSerie.class);
//        System.out.println(datos);

        // Busca los datos de todas las temporadas
        List<DatosTemporadas> temporadas = new ArrayList<>();
        for (int i = 1; i <= datos.totalDeTemporadas(); i++) {
            json = consumoApi.obtenerDatos(URL_BASE + nombreSerie.replace(" ", "+") + "&Season=" + i + API_KEY);
            var datosTemporadas = conversor.obtenerDatos(json, DatosTemporadas.class);
            temporadas.add(datosTemporadas);
        }
        //temporadas.forEach(System.out::println); //se imprime toda la temporada

        // Mostrr solo el titulo de los episodios para las tempordas
//        for (int i = 0; i < datos.totalDeTemporadas(); i++) {
//            List<DatosEpisodio> episodioTemporada = temporadas.get(i).episodios();
//            for (int j = 0; j < episodioTemporada.size(); j++) {
//                System.out.println(episodioTemporada.get(j).titulo());
//            }
//        }
        // Mejorando usando funciones Lambda
        //temporadas.forEach(t -> t.episodios().forEach(e -> System.out.println(e.titulo())));

        // Convertir todas las informaciones a una lista del tipo DatosEpisodio
        List<DatosEpisodio> datosEpisodios = temporadas.stream()
                .flatMap(t->t.episodios().stream())
                .collect(Collectors.toList());

        // Top 5 episodios
        System.out.println("Top 5 episoios");
        datosEpisodios.stream()
                .filter(e->!e.evalucion().equalsIgnoreCase("N/A"))
                .sorted(Comparator.comparing(DatosEpisodio::evalucion).reversed())
                .limit(5)
                .forEach(System.out::println);
        // Conviertiendo los datos a un alista del tipo episodio
        List<Episodio> episodios = temporadas.stream()
                .flatMap(t->t.episodios().stream()
                        .map(d->new Episodio(t.numero(), d)))
                .collect(Collectors.toList());

        episodios.forEach(System.out::println);

        // Busqueda de episodios a partir de X año
        System.out.println("Indica el año a partir del sual deseas ver los episodios");
        var fecha = teclado.nextInt();
        teclado.nextLine();
        LocalDate fechaBusqueda = LocalDate.of(fecha, 1, 1);

        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("dd/MM/yyyy");
        episodios.stream()
                .filter(e->e.getFechaDeLAnzamiento() != null && e.getFechaDeLAnzamiento().isAfter(fechaBusqueda))
                .forEach(e-> System.out.println(
                        "Temporada " + e.getTemporada() +
                                "Episodio " + e.getTitulo() +
                                "Fecha de Lanzamiento " + e.getFechaDeLAnzamiento().format(dtf)
                ));

    }
}









1 respuesta

Hola Juan, espero que estés bien

¡Espero que estés disfrutando del curso! Veo que estás trabajando en la manipulación de datos de episodios utilizando streams en Java. Tu código ya está bastante bien encaminado, pero puedo ofrecerte algunas sugerencias para asegurarte de que estás cumpliendo con los requisitos de la actividad.

  1. Creación de List<Episodio>: Parece que ya has implementado correctamente la conversión de List<DatosEpisodio> a List<Episodio>. Estás utilizando flatMap para recorrer las temporadas y mapear cada DatosEpisodio a un nuevo objeto Episodio. Esto es exactamente lo que se busca en la actividad.

  2. Impresión de los 5 mejores episodios: También has implementado la lógica para filtrar y ordenar los episodios según su evaluación, imprimiendo los 5 mejores. Solo asegúrate de que el método evalucion de DatosEpisodio devuelva un valor que pueda ser comparado correctamente. Si es un valor numérico en formato de cadena, podrías necesitar convertirlo a un tipo numérico antes de ordenar.

  3. Búsqueda de episodios a partir de un año específico: Tu implementación para filtrar episodios por fecha de lanzamiento parece correcta. Estás utilizando LocalDate para comparar fechas, lo cual es una buena práctica. Asegúrate de que el método getFechaDeLAnzamiento de Episodio devuelva un LocalDate válido.

En resumen, parece que estás en el camino correcto. Asegúrate de probar tu código con diferentes entradas para verificar que todo funcione como se espera.

Espero haber ayudado y buenos estudios!