1
resposta

[Projeto] solução parte 2

Veiculos.java

package br.com.alura.tabelafipe.tabela_fipe.model;

import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

@JsonIgnoreProperties(ignoreUnknown = true)
public record Veiculo(
        @JsonAlias("Valor") String valor,
        @JsonAlias("Marca") String marca,
        @JsonAlias("Modelo") String modelo,
        @JsonAlias("AnoModelo") int ano,
        @JsonAlias("Combustivel") String combustivel
) {
}

CoverteDados.java

package br.com.alura.tabelafipe.tabela_fipe.service;


import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class ConverteDados{
    private ObjectMapper mapper = new ObjectMapper();

    public <T> T obterDados(String json, Class<T> classe) {
        try {
            return mapper.readValue(json, classe);
        } catch (JsonProcessingException e) {
            throw new RuntimeException(e);
        }
    }
}

Principal.java

public class Principal {
    private final Scanner scanner = new Scanner(System.in);
    private final ConsumoApi consumo = new ConsumoApi();
    private final ConverteDados converte = new ConverteDados();
    private final String ENDERECO = "https://parallelum.com.br/fipe/api/v1/";
    public void exibeMenu() {
        try {
            String input;
            int inputInt;
            System.out.println("""
                        ***********************
                        *DIGITE UMA DAS OPÇÕES*
                        ***********************
                        Carros
                        Caminhoes
                        Motos
                        ----------------------
                    
                    """);
            input = scanner.nextLine();
            Set<String> permitidos = Set.of("carros", "caminhoes", "motos");
            if(!permitidos.contains(input.toLowerCase())){ throw new IllegalArgumentException();}
            String enderecoParaMarcas = ENDERECO + input.toLowerCase() + "/marcas/";
            String json = consumo.consumir(enderecoParaMarcas);
            List<DadosRecebidos> dadosMarcas = List.of(converte.obterDados(json, DadosRecebidos[].class));
            dadosMarcas.forEach(System.out::println);
            System.out.println("Informe o código da marca para consulta");
            inputInt = scanner.nextInt();
            scanner.nextLine();
            String enderecoParaModelos = enderecoParaMarcas + inputInt + "/modelos/";
            String json2 = consumo.consumir(enderecoParaModelos);
            ListaModelos listaModelos = converte.obterDados(json2, ListaModelos.class);
            listaModelos.modelos().forEach(System.out::println);
            System.out.println("Digite um trecho do nome do carro para consulta");
            String consulta = scanner.nextLine();
            List<DadosRecebidos> consultado = listaModelos.modelos().stream()
                    .filter(e -> e.descricao().toLowerCase().contains(consulta.toLowerCase()))
                    .sorted(Comparator.comparingInt(e -> Integer.parseInt(e.codigo())))
                    .toList();
            if (consultado.isEmpty()) {
                throw new NoSuchElementException("Nao foi encontrado nenhum veiculo com esse nome");
            }
            consultado.forEach(System.out::println);
            System.out.println("Informe o código do modelo para consulta");
            inputInt = scanner.nextInt();
            scanner.nextLine();
            String enderecoParaAnos = enderecoParaModelos + inputInt + "/anos/";
            String json3 = consumo.consumir(enderecoParaAnos);
            List<DadosRecebidos> dados = List.of(converte.obterDados(json3, DadosRecebidos[].class));
            List<String> codigos = dados.stream()
                    .map(DadosRecebidos::codigo)
                    .toList();


            List<Veiculo> veiculos = codigos.stream()
                    .map(codigo -> {
                        String json4 = consumo.consumir(enderecoParaAnos + codigo);
                        return converte.obterDados(json4, Veiculo.class);
                    })
                    .toList();

            System.out.println("\nTodos os veiculos com os valores por ano:");
            veiculos.forEach(System.out::println);
        } catch (NoSuchElementException | NullPointerException e) {
            System.out.println("Não foi encontrado nenhum valor para o input fornecido");
        }catch (IllegalArgumentException e){
            System.out.println("Argumento invalido, verifique se digitou corretamente!");
        }
    }
}
1 resposta

Olá Iago! Tudo certo?

Parabéns por compartilhar sua solução para o desafio! É sempre interessante ver como diferentes pessoas abordam o mesmo problema e desenvolvem suas próprias soluções.

Continue explorando e experimentando diferentes abordagens, isso é essencial para o crescimento no campo da programação!

Bons estudos!