How to filter a list of objects? How can I write this method better?

Asked

Viewed 171 times

0

I would like to write this method in a cleaner and more performing way. Someone has an idea?

private List<Projeto> filtraResultado(List<Projeto> projetosAssinados, String[] filtros){
    List<Projeto> result = new ArrayList<Projeto>();
    for(Projeto p: projetosAssinados) {
        if(existeFiltroBuscadoNosCamposDePesquisa(p.getDsProjeto(), filtros) ||
           existeFiltroBuscadoNosCamposDePesquisa(p.getNomeProjeto(), filtros) ||
           existeFiltroBuscadoNosCamposDePesquisa(p.getSetor(),filtros) ||
           existeFiltroBuscadoNosCamposDePesquisa(p.getUn(), filtros) ||
           existeFiltroBuscadoNosCamposDePesquisa(p.getProcessosModelados(),filtros)||
           existeFiltroBuscadoNosCamposDePesquisa(p.getServicosPrestados(),filtros) ||
           existeFiltroBuscadoNosCamposDePesquisa(p.getTecnologias(),filtros)||
           existeFiltroBuscadoNosCamposDePesquisa(p.getDetalhamento(),filtros)) {
                result.add(p);
        }

    }
    return result;
}

public boolean existeFiltroBuscadoNosCamposDePesquisa(String campoPesquisado,String[] filtros ){
    if(campoPesquisado == null) {
        return false;
    }
    for(String f: filtros) {
        if(StringUtils.containsIgnoreCase(campoPesquisado, f.trim())) {
            return true;
        }
    }
    return false;

}
  • I believe it is possible to implement this with far fewer lines of code and more reusable code, and possibly using parallelism to increase performance. However, doing it in fewer lines the way I’m thinking might disrupt performance. What you consider most important in this case, simpler, reusable performance or code?

  • You are using Java 8?

  • yes I’m using java 8, I even thought about using stream, but it turns out it’s one inside another

  • I rewrote using fewer lines and less rewritten code, but I believe q is still possible to improve.

3 answers

1


  • great tip, thanks!

0

private List<Projeto> filtraResultado(List<Projeto> projetosAssinados, String[] filtros) {
    List<Projeto> result = new ArrayList<Projeto>();
    boolean contains;

    Set< String > filterSet = Arrays.asList(filtros).stream( ).collect(Collectors.toSet());

    for (Projeto p : projetosAssinados) {

        List<String> toCheckList  = Arrays.asList(
                p.getDsProjeto(), p.getNomeProjeto(),
                p.getSetor(), p.getUn(), 
                p.getProcessosModelados(), p.getServicosPrestados(), 
                p.getTecnologias(), p.getDetalhamento());

        contains = toCheckList
                 .stream( )
                 .anyMatch( list -> filterSet.stream( )
                 .anyMatch(filter -> StringUtils.containsIgnoreCase( list, filter)));

        if(contains) {
            result.add(p);
        }
    }
    return result;
}
  • 1

    Wouldn’t it be better to concatenate the "toCheckList" list into a String? I believe that concatenated into a String you reduce this excess code a little and will have the same result. When concatenating, just remember to leave a space, or a special character not to modify the logic.

0

public class Teste {

    public static void main(String[] args) {
        Teste teste = new Teste();
        List<Projeto> projetos = new ArrayList<>();
        Projeto projeto = new Projeto("0002", "Teste", "TI", "457", "254", "Consultoria"
                , "Java", "Testes unitarios");
        Projeto projeto1 = new Projeto("0003", "Locomocao", "TI", "784", "145", "Consultoria"
                , "Java", "Testes unitarios");
        Projeto projeto2 = new Projeto("0005", "Locomocao124", "TI", "784", "547", "Consultoria"
                , "Python", "Testes funcional");

        projetos.add(projeto);
        projetos.add(projeto1);
        projetos.add(projeto2);

        String[] filtros = {"123", "Java", "145"};

        List<Projeto> list = teste.filtraResultado(projetos, filtros);

        for (Projeto projeto3: list) {
            System.out.println(projeto3);
        }


    }


    private List<Projeto> filtraResultado(List<Projeto> projetosAssinados, String[] filtros) {
        List<Projeto> projetoList = new ArrayList<>();
        ArrayList<String> strings = new ArrayList<>();

        for (Projeto projeto : projetosAssinados) {
            for (String filtro : filtros) {
                if (projeto.toString().contains(filtro)) {
                    projetoList.add(projeto);
                }
            }

        }
        return projetoList;
    }

Browser other questions tagged

You are not signed in. Login or sign up in order to post.