Função com parametro do tipo List

Caros,

Estou com uma query onde traz os registros corretamente, porém preciso verificar agora se estes registros trazidos pela query satisfaz uma condição.

Pensei em ter uma função que passo o resultado desta query como parametro e retorne uma lista com os registros que satisfazem esta condição.

Alguma dica de função que recebe uma lista e retorna uma lista ou alguma outra dica de como fazer isso?

qualquer ajuda e valida…

desde já agradeço.

Você não consegue retornar esta lista já em seu select com uma clausula where?

[quote=jeroqueiroz]Caros,

Estou com uma query onde traz os registros corretamente, porém preciso verificar agora se estes registros trazidos pela query satisfaz uma condição.

Pensei em ter uma função que passo o resultado desta query como parametro e retorne uma lista com os registros que satisfazem esta condição.

Alguma dica de função que recebe uma lista e retorna uma lista ou alguma outra dica de como fazer isso?

qualquer ajuda e valida…

[/quote]

Supondo que a condição não pode ser testada via SQL de forma a filtrar os objetos no banco, a forma padrão de fazer isto é usar um filtro assim


interface Filter<T>{

   boolean accept(T obj);
}

//em outra classe
public static <T> void filter(Collection<T> dados,Filter<T> filter, Collection<T> resultado){

      for (T obj : dados){
               if(filter.accept(obj)){
                     resultado.add(obj);
               }
      }

}

Quem passa no filtro é quem fizer o método accept retornar true. Quem passar é adicionado ao resultado.
Este modelo permite que vc use qualquer tipo de coleção, não apenas list.

Se vc quer apenas remover quem não passar o filtro e souber que a coleção é editável, vc pode fazer assim (que é mais rápido)

public static <T> void filter(Collection<T> dados,Filter<T> filtro{

      for (Iterator<T> it = dados.iterator();it.hasNext();){
               T obj = it.next();
               if(!filter.accept(obj)){ // atenção ao not
                     it.remove();
               }
      }

}

Por exemplo, obter apenas nomes começados por A



List<String> lista = Arrays.asList("Ana", "Amanda","Beatriz","Carla");

List<String> resultado = new ArrayList<String>();

Filter<String> filter = new Filter(){ // inner class

      public boolean accept(String s){
          return s.startWith("A");
     }

}

CollectionUtils.filter(lista, filter, resultado);

O que preciso fazer pode ser feito pelo banco mesmo…

Não vejo a possibilidade de tratar na própria query, devido este query q tenho ele busca em uma tabela de histórico, onde um mesmo documento pode ter vários registros sendo que tenho q ver se o mais atual esta com um determinado status (tipo = 1), sendo que se o maior registro deste documento for com status (tipo = 2) ele não traz, ou seja não posso colocar na query q ele pegue com tipo =1 porque ele vai trazer porém não será o maior registro, pois o maior já esta com o status tipo=2.

Então pensei em trazer os maiores registro passar pra uma função que verifica se o satus dos trazidos e igual a 1.

mais alguma dica…

[quote=jeroqueiroz]O que preciso fazer pode ser feito pelo banco mesmo…

Não vejo a possibilidade de tratar na própria query, devido este query q tenho ele busca em uma tabela de histórico, onde um mesmo documento pode ter vários registros sendo que tenho q ver se o mais atual esta com um determinado status (tipo = 1), sendo que se o maior registro deste documento for com status (tipo = 2) ele não traz, ou seja não posso colocar na query q ele pegue com tipo =1 porque ele vai trazer porém não será o maior registro, pois o maior já esta com o status tipo=2.

Então pensei em trazer os maiores registro passar pra uma função que verifica se o satus dos trazidos e igual a 1.

mais alguma dica… [/quote]

Porque vc não pode pedir o maior registro cujo tipo é 1 ? (Select * from T where tipo = 1 and date in select max(date) from T)

Porque ele vai encontrar este registro que to procurando, sendo que na verdade o que tem a maior data não é do tipo 1, e sim do tipo 3.

Ou seja porque o registro tipo 1 existe… devido ser uma tabela de histórico.

Que banco vc utiliza?
Caso for Oracle, vc pode tentar usar as funções analíticas do Oracle.
Funções analíticas, diferentemente de comandos SQL normal, utilizam o resultado de uma query e fazem filtros nos resultados.
É uma funcionalidade muito interessante e muito útil.
Link:
http://www.orafaq.com/node/55