1
resposta

Dúvida de como percorrer listas de forma correta.

Olá pessoal, estou com duvidas em uma implementação que realizei, se esta feita da maneira correta ou se teria uma forma melhor de escrever o código. Dado as seguintes classes :

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CampoDto {

    private String chave;
    private String valor;
    }

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClienteEmailSaidaDto {

    @JsonProperty("campo")
    private List<CampoDto> campo;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClienteLocalSaidaDto {


    @JsonProperty("campo")
    private List<CampoDto> campo;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ClienteSaidaDto {


    @JsonProperty("campo")
    private List<CampoDto> campo;
    @JsonProperty("locais-cliente")
    private List<ClienteLocalSaidaDto> locaisCliente;
    @JsonProperty("emails-cliente")
    private List<ClienteEmailSaidaDto> emailsCliente;

}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DadosPessoaisSaidaDto {
    private List<ClienteSaidaDto> cliente;

}
// preenchendo algumas informações
CampoDto campo1 = new CampoDto();
CampoDto campo2 = new CampoDto();
campo1.setChave("nrCpf");
campo1.setValor("123456");
campo2.setChave("nrRg");
campo2.setValor("789123");
List<CampoDto> campos = new ArrayList<>();
campos.add(campo1);
campos.add(campo2);
ClienteSaidaDto cliente = new ClienteSaidaDto();
cliente.setCampo(campos);

conforme o exemplo acima preciso percorrer essa estrutura de classes para realizar algumas validações, por exemplo em algum das classes existe a chave nrCpf e esta populada com algum valor. Realizei a implementação abaixo e gostaria de saber se esta feita de forma correta ou se teria alguma forma melhor para otimizar os códigos.

public void verificarInformacoes(){
          String emailObtido        =  "Nao";    
          String nrCpfObtido        = "Nao";    
          String telefoneObtido   = "Nao";
         String  rgObtido              = "Nao";
         String nomeObtido        = "Nao";
    InformacoesConsultaSaidaDto informacaoes = new InformacoesConsultaSaidaDto();

    Optional optCliente     = Optional.ofNullable(dadosPessoais.getCliente());

        if(optCliente.isPresent()) {

                dadosPessoais.getCliente()
                             .forEach(cli ->{

                        cli.getEmailsCliente().forEach(email -> {

                            email.getCampo().forEach(a -> {
                                if (a.getChave().equals("dsEmail")) {
                                    if((a.getValor()!=null)||(!a.getValor().isEmpty())) {
                                        emailObtido = "Sim";

                                    }
                                }
                            });

                        });
                    });



                //
                dadosPessoais.getCliente()
                     .forEach(cli ->{

                cli.getLocaisCliente().forEach(locais -> {

                    locais.getCampo().forEach(a -> {
                        if (a.getChave().equals("nrCpf")) {
                            if((a.getValor()!=null)||(!a.getValor().isEmpty())) {
                                nrCpfObtido = "Sim";

                            }
                        }
                    });

                });
            });


                dadosPessoais.getCliente()
                     .forEach(cli ->{

                cli.getLocaisCliente().forEach(loc -> {

                    loc.getCampo().forEach(a -> {
                        if (a.getChave().equals("nrCpf")) {
                            if((a.getValor()!=null)||(!a.getValor().isEmpty())) {
                                nrCpfObtido = "Sim";

                            }
                        }
                    });

                });
            });

            //            

                //
                dadosPessoais.getCliente()
                     .forEach(cli ->{

                cli.getTelefonesCliente().forEach(telefone -> {

                    telefone.getCampo().forEach(a -> {
                        if (a.getChave().equals("nrTelefone")) {
                            if((a.getValor()!=null)||(!a.getValor().isEmpty())) {
                                telefoneObtido = "Sim";

                            }
                        }
                    });

                });
            });

            //
            dadosPessoais.getCliente()
                     .forEach(nome ->{

                         nome.getCampo().forEach(d -> {

                           if (d.getChave().equals("nmCliente")) {
                                if((d.getValor()!=null)||(!d.getValor().isEmpty())) {
                                    nomeObtido = "Sim";

                                }
                            }
                         });
            });

            //
            dadosPessoais.getCliente()
                 .forEach(rg ->{

                     rg.getCampo().forEach(d -> {

                       if (d.getChave().equals("nrRg")) {
                            if((d.getValor()!=null)||(!d.getValor().isEmpty())) {
                                rgObtido = "Sim";

                            }
                        }
                     });
        });


        }


}
1 resposta

Olá Marcos, tudo bem?

Percorrer listas em Java pode ser um pouco complexo, mas existem algumas formas de otimizar o código e deixá-lo mais legível. No seu caso, você pode utilizar o método stream() para percorrer as listas e realizar as validações de forma mais simples e eficiente.

Segue um exemplo de como você pode utilizar o stream() para verificar se a chave "nrCpf" existe e está preenchida em algum dos objetos da lista de clientes:

boolean nrCpfPreenchido = dadosPessoais.getCliente().stream()
    .flatMap(cliente -> Stream.concat(
        cliente.getCampo().stream(),
        cliente.getLocaisCliente().stream().flatMap(local -> local.getCampo().stream())
    ))
    .anyMatch(campo -> "nrCpf".equals(campo.getChave()) && campo.getValor() != null && !campo.getValor().isEmpty());

Esse código utiliza o método flatMap() para "achatar" a lista de campos de todos os clientes e locais de cada cliente em uma única lista, e em seguida utiliza o método anyMatch() para verificar se existe algum campo com a chave "nrCpf" preenchido.

Você pode utilizar essa mesma abordagem para verificar as outras informações que precisa. Espero ter ajudado e bons estudos!