1
resposta

Faça como eu fiz: aplicando streams e manipulando dados

package br.com.alura.screematch.modelos;

public class Episodio implements Comparable { private int temporada; private String titulo; private int numero; private double avaliacao;

public Episodio(int temporada, DadosEpisodio dadosEpisodio) {
    this.temporada = temporada;
    this.titulo = dadosEpisodio.getTitle();
    this.numero = Integer.parseInt(dadosEpisodio.getEpisode());
    this.avaliacao = dadosEpisodio.getImdbRating() != null && !dadosEpisodio.getImdbRating().equals("N/A")
            ? Double.parseDouble(dadosEpisodio.getImdbRating())
            : 0.0;
}

public int getTemporada() {
    return temporada;
}

public String getTitulo() {
    return titulo;
}

public int getNumero() {
    return numero;
}

public double getAvaliacao() {
    return avaliacao;
}

@Override
public int compareTo(Episodio outro) {
    return Double.compare(outro.avaliacao, this.avaliacao); // decrescente
}

@Override
public String toString() {
    return "Temporada " + temporada + " - Episódio " + numero +
            ": " + titulo + " (Avaliação: " + avaliacao + ")";
}

}

List<Episodio> episodios = new ArrayList<>();

for (int i = 1; i <= totalTemporadas; i++) { String urlTemporada = "https://www.omdbapi.com/?t=" + nomeSerie + "&Season=" + i + "&apikey=fa9f1b6b"; HttpRequest requestTemporada = HttpRequest.newBuilder().uri(URI.create(urlTemporada)).build(); HttpResponse responseTemporada = client.send(requestTemporada, HttpResponse.BodyHandlers.ofString());

DadosTemporada dadosTemporada = gson.fromJson(responseTemporada.body(), DadosTemporada.class);

for (DadosEpisodio dados : dadosTemporada.getEpisodios()) {
    Episodio episodio = new Episodio(i, dados);
    episodios.add(episodio);
}

}

System.out.println("\nTop 5 episódios mais bem avaliados:");

episodios.stream() .sorted() // já usa Comparable .limit(5) .forEach(System.out::println);

System.out.print("\nDigite o ano para filtrar episódios: ");

int anoFiltro = Integer.parseInt(leitura.nextLine());

System.out.println("\nEpisódios a partir de " + anoFiltro + ":");

episodios.stream() .filter(e -> { try { return Integer.parseInt(e.getDataLancamento().split("-")[0]) >= anoFiltro; } catch (Exception ex) { return false; } }) .forEach(System.out::println);

public class DadosEpisodio {
private String Title;
private String Episode;
private String imdbRating;
private String Released;

public String getTitle() {
    return Title;
}

public String getEpisode() {
    return Episode;
}

public String getImdbRating() {
    return imdbRating;
}

public String getReleased() {
    return Released;
}

}

public class DadosTemporada { private List Episodes;

public List<DadosEpisodio> getEpisodios() {
    return Episodes;
}

}

1 resposta

Oi, Gabrielly! Como vai?

Gostei bastante de como você utilizou o Comparable para ordenar os episódios por avaliação, facilitando o uso do stream().sorted() de forma bem eficiente. Sua organização ao estruturar as classes também ficou muito clara.

Uma dica interessante para o futuro é usar o método map em streams para transformar dados antes de exibi-los. Veja este exemplo:


episodios.stream()
    .map(e -> e.getTitulo().toUpperCase())
    .forEach(System.out::println);

Esse código imprime todos os títulos em letras maiúsculas, transformando os dados durante o fluxo.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!