Pense nessa ideia... digamos que vc ja tenha 2 classes no seu pacote de utilidades... Filter.java e CollectionUtils.java
ve como seria simples... filtrar 1 coleção...
class Pessoa {
private int idade;
public int getIdade() { return idade; }
....
}
...
class Teste {
public static void main(String[] args) {
Collection<Pessoa> pessoas = getAllPessoas(); //aqui abstraio como vc pega a lista
//Criando o filtro de pessoas igual a 30 anos.
Filter<Pessoa> igualA30 = new Filter<Pessoa>() {
public boolean match(Pessoa pessoa) {
return object.getIdade() == 30;
}
}
//pegando os valores que passam no filtro
List<Pessoa> pessoasCom30Anos = CollectionUtils.findAllMatch(pessoas, igualA30);
}
}
Agora abaixo segue como criar as classes utilitarias e a interface... e pense que essa ideia é reutilizavel
Vc cria uma interface chamada FIltro... isso vc vai poder usar sempre que precisar agora...
Filtro.java/**
* Filtro para de objetos.
* @author Tomaz Lavieri
* @param <T> o tipo de objeto do filtro.
*/
public interface Filter<T> {
/**
* Verifica se o objeto confere com o filtro.
* @param object o objeto a ser verificado.
* @return se o objeto passa no filtro.
*/
public boolean match(T object);
}
Ai vc cria uma classe utilitaria, para manipular Coleções, que vc vai poder usar sempre tb
CollectionsUtils.javaimport java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
/**
* Classe utilitária para manipular coleções
* @author Tomaz Lavieri
*/
public class CollectionUtils {
/**
* Não é possivel instaciar CollectionUtils.
*/
private CollectionUtils(){}
/**
* Adciona a coleção <tt>recipient</tt> todos os objetos <tt>T</tt> da lista
* de <tt>candidates</tt> que coincidirem com o <tt>filter</tt>.
* <BR>
* <BR>Adciona o inverso dos itens de <tt>candidates</tt> que
* {@link #addAllNotMatch(Collection, Filter, Collection)} adcionaria.
* @param <T> o tipo de objeto a ser adcionado.
* @param candidates a coleção de candidatos a serem adcionados ao
* <tt>recipient</tt>.
* @param filter o filtro que será usado para <b><u>aceitar</u></b> um
* candidato a ser adcionado ao <tt>recipient</tt>.
* @param recipient coleção onde os objetos serão adicionados.
* @see #addAllNotMatch(Collection, Filter, Collection)
*/
public static <T> void addAllMatch(Collection<? extends T> candidates,
Filter<T> filter, Collection recipient) {
for (T object : candidates)
if (filter.match(object))
recipient.add(object);
}
/**
* Adciona a coleção <tt>recipient</tt> todos os objetos <tt>T</tt> da lista
* de <tt>candidates</tt> que não coincidirem com o <tt>filter</tt>.
* <BR>
* <BR>Adciona o inverso dos itens de <tt>candidates</tt> que
* {@link #addAllMatch(Collection, Filter, Collection)} adcionaria.
* @param <T> o tipo de objeto a ser adcionado.
* @param candidates a coleção de candidatos a serem adcionados ao
* <tt>recipient</tt>.
* @param filter o filtro que será usado para <b><u>recusar</u></b> um
* candidato a ser adcionado ao <tt>recipient</tt>.
* @param recipient coleção onde os objetos serão adicionados.
* @see #addAllNotMatch(Collection, Filter, Collection)
*/
public static <T> void addAllNotMatch(Collection<? extends T> candidates,
Filter<T> filter, Collection recipient) {
for (T object : candidates)
if (!filter.match(object))
recipient.add(object);
}
/**
* Busca todos os objetos <b>T</b> na lista de <tt>candidates</tt> que
* conferem com o <tt>filter</tt>.
* <BR>
* <BR>Tem o resultado inverso a {@link #findAllNotMatch(Collection, Filter)}
* @param <T> o tipo de objeto a ser buscado.
* @param candidates a coleção de condidatos aonde deseja-se realizar a
* busca.
* @param filter o filtro que será usado para <b><u>aceitar</u></b> um
* candidato no resultado da busca.
* @return todos os itens que passaram pelo filtro.
* @see #findAllNotMatch(Collection, Filter)
*/
public static <T> List<T> findAllMatch(Collection<? extends T> candidates,
Filter<T> filter) {
List<T> matchs = new ArrayList<T>(0);
addAllMatch(candidates, filter, matchs);
return matchs;
}
/**
* Busca todos os objetos <b>T</b> na lista de <tt>candidates</tt> que
* <u>não</u> conferem com o <tt>filter</tt>.
* <BR>
* <BR>Tem o resultado inverso a {@link #findAllMatch(Collection, Filter)}
* @param <T> o tipo de objeto a ser buscado.
* @param candidates a coleção de condidatos aonde deseja-se realizar a
* busca.
* @param filter o filtro que será usado para <b><u>negar</u></b> um
* candidato no resultado da busca.
* @return todos os itens que <u>não</u> passaram pelo filtro.
* @see #findAllMatch(Collection, Filter)
*/
public static <T> List<T> findAllNotMatch(Collection<? extends T> candidates,
Filter<T> filter) {
List<T> notMatchs = new ArrayList<T>(0);
addAllNotMatch(candidates, filter, notMatchs);
return notMatchs;
}
/**
* Busca o primeiro objeto <tt>T</tt> na coleção <tt>candidates</tt> que
* coincide com o <tt>filter</tt>.
* @param <T> o tipo de objeto a procurar.
* @param candidates a coleção de candidatos a ser pesquisados.
* @param filter o filtro que será usado para <b><u>aceitar</u></b> o
* candidato.
* @return O primeiro objeto de <tt>candidates</tt> que coincidir com o
* <tt>filter</tt>.
*/
public static <T> T findFirstMatch(Collection<? extends T> candidates,
Filter<T> filter) {
for (T object : candidates)
if (filter.match(object))
return object;
return null;
}
/**
* Busca o primeiro objeto <tt>T</tt> na coleção <tt>candidates</tt> que
* <u>não</u> coincide com o <tt>filter</tt>.
* @param <T> o tipo de objeto a procurar.
* @param candidates a coleção de candidatos a ser pesquisados.
* @param filter o filtro que será usado para <b><u>recusar</u></b> o
* candidato.
* @return O primeiro objeto de <tt>candidates</tt> que <u>não</u>
* coincidir com o <tt>filter</tt>.
*/
public static <T> T findFirstNotMatch(Collection<? extends T> candidates,
Filter<T> filter) {
for (T object : candidates)
if (!filter.match(object))
return object;
return null;
}
/**
* Remove da coleção de <tt>candidates</tt> todos os objetos <tt>T</tt> que
* coincidirem com o <tt>filter</tt>.
* <BR>
* <BR>Tem o resultado inverso a {@link #retainAll(Collection, Filter)}.
* @param <T> o tipo de objeto a ser filtrado.
* @param candidates a coleção que será filtrada.
* @param filter o filtro que será usado para <b><u>remover</u></b> os
* candidato, da coleção <tt>candidates</tt>.
* @throws UnsupportedOperationException caso a operação
* {@link Iterator#remove()} não seja suportada pelo
* {@link Iterator} gerado pela coleção <tt>candidates</tt>.
* @see Collection#iterator()
*/
public static <T> void removeAll(Collection<? extends T> candidates,
Filter<T> filter) throws UnsupportedOperationException {
for(Iterator<? extends T> itr = candidates.iterator(); itr.hasNext();)
if (filter.match(itr.next()))
itr.remove();
}
/**
* Retem na coleção de <tt>candidates</tt> apenas os objetos <tt>T</tt> que
* coincidirem com o <tt>filter</tt>.
* <BR>
* <BR>Tem o resultado inverso a {@link #removeAll(Collection, Filter)}.
* @param <T> o tipo de objeto a ser filtrado.
* @param candidates a coleção que será filtrada.
* @param filter o filtro que será usado para <b><u>reter</u></b> os
* candidato, da coleção <tt>candidates</tt>.
* @throws UnsupportedOperationException caso a operação
* {@link Iterator#remove()} não seja suportada pelo
* {@link Iterator} gerado pela coleção <tt>candidates</tt>.
* @see Collection#iterator()
*/
public static <T> void retainAll(Collection<? extends T> candidates,
Filter<T> filter) throws UnsupportedOperationException {
for(Iterator<? extends T> itr = candidates.iterator(); itr.hasNext();)
if (!filter.match(itr.next()))
itr.remove();
}
public static <T> T removeFirstMatch(Collection<? extends T> candidates,
Filter<T> filter) throws UnsupportedOperationException {
for(Iterator<? extends T> itr = candidates.iterator(); itr.hasNext();) {
T object = itr.next();
if (filter.match(object)) {
itr.remove();
return object;
}
}
return null;
}
public static <T> T removeFirstNotMatch(Collection<? extends T> candidates,
Filter<T> filter) throws UnsupportedOperationException {
for(Iterator<? extends T> itr = candidates.iterator(); itr.hasNext();) {
T object = itr.next();
if (!filter.match(object)) {
itr.remove();
return object;
}
}
return null;
}
}