Tem algumas ideias interessantes.
Se você for ver do ponto de vista de programação funcional, você poderia chamar um método da sua lista chamado filter, enviando uma função que será aplicada a cada item da sua coleção, dizendo se o filtro vai remover aquele item da lista ou não.
Em Java, a maneira mais simples de fazer isso é como você mesmo disse, criando uma lista nova, e iterando a lista antiga. É simples, feio, e funciona.
Por exemplo, filtrar os números pares de uma lista de números:
public static void main(String[] args){
List<Integer> numeros = Arrays.asList(new Integer[]{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10});
List<Integer> pares = new ArrayList<Integer>();
for(Integer numero : numeros){
if(numero % 2 == 0){
pares.add(numero);
}
}
}
Agora como fazer isso sem toda essa verbosidade? Eu falei sobre isso
nesse post, caso queira dar uma lida pode te dar umas ideias. Mas a ideia geral é que você pode fazer isso utilizando uma
classe interna anônima.
Agora para o seu caso em específico, onde você vai trabalhar em cima da mesma lista, talvez seja melhor manter uma mesma lista, e criar diversas visões em cima dessa lista.
Você pode fazer isso usando o
Google Guava (ou na mão mesmo), criando
Iterables diferentes para cada filtro que queira aplicar.
O exemplo acima reescrito com Guava fica assim:
public static void main(String[] args){
List<Integer> numeros = Arrays.asList(new Integer[]{1, 2, 3, 4, 5 ,6, 7, 8, 9, 10});
Iterable<Integer> pares = Iterables.filter(numeros, new Predicate<Integer>(){
@Override
public boolean apply(Integer num) {
return num % 2 == 0;
}
});
}
A vantagem disso é que você não cria um
List inteiro novo, simplesmente um
Iterable. E ele sendo
Iterable você pode percorrê-lo em um for normalmente.
for(Integer num : pares){
System.out.println(num);
}